¿Existe la inferencia automática de tipos en Java?

113

¿Existe un autotipo de variable en Java como el que tiene en C ++?

Un ejemplo:

for ( auto var : object_array)
    std::cout << var << std::endl;

for( auto var : object_array)
    var.do_something_that_only_this_particular_obj_can_do();

Sé que hay un bucle for mejorado en Java, pero ¿hay un auto? Si no es así, ¿hay algún truco para hacer esto? Me refiero a la nueva característica en C ++ 11

Juegos Brainiac
fuente
1
Todo, excepto los tipos fundamentales, se puede asignar a una variable de tipo Object, por lo que para algunas operaciones, puede usar Objectdonde desee auto.
Zyx 2000
1
no Java no tiene tal variable
Aleksei Bulgak
@ Zyx2000: Entonces, usará la to_stringfunción del objeto y no el objeto real en cuestión, ¿no es así?
Juegos Brainiac
2
@GamesBrainiac: No, usará la versión anulada, si existe.
Keppil
2
El término que está buscando no es "automático", es "inferencia de tipo". Hay bastantes preguntas sobre la inferencia de tipos en Java, aunque en su mayoría se refieren a genéricos, por lo que no estoy seguro de cómo encontrar un duplicado ...

Respuestas:

49

Respondido antes de que la pregunta fuera EDITADA :

No, no hay ningún autotipo de variable en Java. El mismo bucle se puede lograr como:

for ( Object var : object_array)
  System.out.println(var);

Java tiene variables locales, cuyo alcance está dentro del bloque donde se han definido. Similar a C y C ++, pero no hay una palabra clave automática o de registro. Sin embargo, el compilador de Java no permitirá el uso de una variable local inicializada no explícitamente y dará un error de compilación (a diferencia de C y C ++ donde el compilador generalmente solo dará una advertencia). Cortesía: Wikipedia .

No, no hay ninguna inferencia de tipo convencional en Java como C ++. Hubo una RFE pero se cerró como "No se arreglará", la razón dada fue:

Los seres humanos se benefician de la redundancia de la declaración de tipo de dos formas. Primero, el tipo redundante sirve como documentación valiosa; los lectores no tienen que buscar la declaración de getMap () para averiguar qué tipo devuelve. En segundo lugar, la redundancia permite al programador declarar el tipo deseado y, por lo tanto, beneficiarse de una verificación cruzada realizada por el compilador.

BOBO
fuente
10
@GamesBrainiac No, las llamadas a métodos siempre son polimórficas en Java. Sin embargo, muchas otras cosas (por ejemplo, resolución de sobrecarga o cualquier operación no definida Object) no se pueden hacer de esta manera. Esta no es realmente una buena respuesta, solo funciona porque el ejemplo de la pregunta es débil.
10
Esta pregunta trata sobre la inferencia de tipos en C ++ 11, no sobre el uso anterior de autoen C y pre-C ++ 11. Tu edición está fuera de tema.
4
"Eso no es lo que quise decir, una vez que escribes lanzarlo a un Objeto, te dará la cadena to_string del Objeto" Falso. Absolutamente 100% falso.
Louis Wasserman
140
"Los humanos se benefician de la redundancia". Es verdad. Cada mañana me despierto y pienso "¿cómo puedo hacer que mi código sea más redundante?". Por los beneficios.
ahoffer
2
Además, esta respuesta es obsoleta porque vares una palabra clave reservada desde Java 9.
6infinity8
69

Podría ser que Java 10 tenga lo que tú (y yo) queremos, a través de la varpalabra clave.

var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

De las propuestas de mejora del JDK 286


Actualización: ¡ Sí, esa característica se incorporó a la versión Java 10!

perdonmissjackson
fuente
6
Ya es una mejora, pero esa palabra clave solo puede funcionar con variables locales. No es tan poderoso como la inferencia automática de tipos de C ++
texasbruce
7
Minor pick-pick: ¡ varno es una palabra clave! De JLS : "var no es una palabra clave, sino más bien un identificador con un significado especial como el tipo de declaración de variable local". Por lo tanto, a diferencia de las palabras clave, no hay nada que le impida llamar a una variable o método "var".
Klitos Kyriacou
2
Buen punto @KlitosKyriacou. Sin embargo, si imagino reemplazar 'palabra clave' con 'identificador', o incluso 'identificador con significado especial como el tipo de declaración de variable local', creo que la respuesta sería menos clara. Pero sí, de varhecho no está en la lista de palabras clave.
sorrymissjackson
No es una palabra clave simplemente por compatibilidad con versiones anteriores. Además del hecho de que puede tener un identificador con este nombre, var cumple la función de palabra clave.
facetus
25

Java 7 presenta la sintaxis de diamante

Box<Integer> integerBox = new Box<>(); // Java 7

En comparación con el antiguo java

Box<Integer> integerBox = new Box<Integer>(); // Before Java 7

El lector crítico notará que esta nueva sintaxis no ayuda a escribir los bucles for en la pregunta original. Eso parece correcto y totalmente intencional. Vea la otra respuesta que cita la base de datos de errores de Oracle.

Tarrasch
fuente
4
Es cierto, pero lo que él (y yo) estamos buscando es algo como:, auto integerBox = new Box<Integer>();esto se usa generalmente para obtener un valor de retorno de funciones que a veces se pueden complejar comoHashMap<String, LinkedList<Operation, Set<Integer>>>
Roee Gavirel
1
Esa preocupación es exactamente lo que abordé después de las muestras de código. La conclusión fue que Java no hace eso, y eso es a propósito.
Tarrasch
18

En Java 8, puede usar la inferencia de tipo lambda para evitar declarar el tipo. El análogo a los ejemplos del interrogador sería:

object_array.forEach(var -> System.out.println(var)); 
object_array.forEach(var -> var.do_something_that_only_this_particular_obj_can_do());

ambos también se pueden simplificar utilizando referencias de métodos:

object_array.forEach(System.out::println); 
object_array.forEach(ObjectType::do_something_that_only_this_particular_obj_can_do);
Ajit George
fuente
8

En resumen, no, no hay tipo automático. Sin embargo, si todo lo que está haciendo es imprimir el valor, puede referirse al valor como un archivo Object.

SimonC
fuente
o computación hashCode, o recopilación de nombres de clases, o ... ya se te ocurrió la idea;) Sin embargo, la lista es corta. Consulte los documentos de la clase de objetos (comentario destinado a principiantes, estoy seguro de que lo sabía SimonC)
Alexander Malakhov
4

No es una solución pura de Java, sin embargo, agregar una biblioteca llamada lombok permitirá que la magia siguiente se compile y funcione de manera muy similar a la autopalabra clave en C ++

List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
    System.out.println(s.length());
}
samvel1024
fuente