Técnicamente hablando, Java tiene inferencia de tipos cuando usa genéricos. Con un método genérico como
public <T> T foo(T t) {
return t;
}
El compilador analizará y comprenderá que cuando escribes
// String
foo("bar");
// Integer
foo(new Integer(42));
Se devolverá una cadena para la primera llamada y un número entero para la segunda llamada en función de lo que se ingresó como argumento. Obtendrá la verificación de tiempo de compilación adecuada como resultado. Además, en Java 7, uno puede obtener algunas inferencias de tipo adicionales al instanciar genéricos como este
Map<String, String> foo = new HashMap<>();
Java es lo suficientemente amable como para completar los corchetes angulares en blanco para nosotros. Ahora, ¿por qué Java no admite la inferencia de tipos como parte de la asignación de variables? En un momento, hubo una RFE para la inferencia de tipos en declaraciones variables, pero esto se cerró como "No se solucionará" porque
Los humanos se benefician de la redundancia de la declaración de tipo de dos maneras. 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.
El colaborador que cerró esto también notó que simplemente se siente "poco parecido a Java", con lo que estoy de acuerdo. La verbosidad de Java puede ser tanto una bendición como una maldición, pero hace que el lenguaje sea lo que es.
Por supuesto, ese RFE en particular no fue el final de esa conversación. Durante Java 7, esta característica se consideró nuevamente , y se crearon algunas implementaciones de prueba, incluida una por el propio James Gosling. Una vez más, esta característica finalmente fue derribada.
Con el lanzamiento de Java 8, ahora obtenemos inferencia de tipos como parte de lambdas como tal:
List<String> names = Arrays.asList("Tom", "Dick", "Harry");
Collections.sort(names, (first, second) -> first.compareTo(second));
El compilador de Java puede mirar el método Collections#sort(List<T>, Comparator<? super T>)
y luego la interfaz Comparator#compare(T o1, T o2)
y determinarlo, first
y second
debería ser String
así permitiendo que el programador renuncie a tener que replantear el tipo en la expresión lambda.