Técnicamente hablando, Java tiene inferencias de tipo cuando se usan genéricos. Con un método genérico como
public <T> T foo(T t) {
return t;
}
El compilador analizará y entenderá que cuando escribas
// String
foo("bar");
// Integer
foo(new Integer(42));
Se devolverá una cadena para la primera llamada y un entero para la segunda llamada en función de lo que se ingresó como argumento. Obtendrás la correcta verificación en tiempo de compilación como resultado. Además, en Java 7, se puede obtener una inferencia de tipo adicional cuando crear instancias genéricas como tal
Map<String, String> foo = new HashMap<>();
Java es lo suficientemente amable para completar los corchetes de ángulo en blanco para nosotros. Ahora, ¿por qué Java no admite inferencia de tipo como parte de la asignación de variables? En un momento dado, había un RFE para hacer inferencias de tipo en declaraciones de variables, pero esto se cerró como "No arreglaré" porque
Los seres 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 sí
no tiene que buscar la declaración de getMap () para averiguar qué tipo
vuelve.
Segundo, 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 "un-java-like", con lo cual 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, esa RFE en particular no fue el final de esa conversación. Durante Java 7, esta función fue nuevamente considerada , con algunas implementaciones de prueba siendo creado, incluyendo uno por el mismo James Gosling. Una vez más, esta función fue finalmente derribada.
Con el lanzamiento de Java 8, ahora obtenemos la 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 ver el método Collections#sort(List<T>, Comparator<? super T>)
y luego la interfaz de Comparator#compare(T o1, T o2)
y determine que first
y second
deben ser String
, lo que le permite al programador renunciar a tener que volver a escribir el tipo en la expresión lambda.