proyectos - programacion generica java
Influencia del operador ternario de Java en la inferencia de tipos genéricos (2)
public List<String> foo1() {
List<String> retval = bar();
if (retval == null)
return Collections.emptyList();
else
return retval;
}
public List<String> foo2() {
List<String> retval = bar();
return retval == null ? Collections.emptyList() : retval;
}
¿Por qué foo1()
compila bien mientras que foo2()
tiene un error? (para ser más precisos, "No coincide el tipo: no se puede convertir desde la Lista <captura # 1-de? extiende el Objeto> a la Lista <String>" )
Pensé que ambas funciones se compilarían con el mismo emptyList()
de emptyList()
, por lo que un compilador inteligente debería inferir el tipo correcto para emptyList()
...
Compila para mí bien en Java 8.
Las versiones anteriores de Java pueden necesitar más ayuda
return retval == null ? Collections.<String>emptyList() : retval;
Deberia trabajar.
EDITAR Esto se debe a las mejoras en la inferencia de tipos de Java 8 como se explica aquí
http://openjdk.java.net/jeps/101
Y aquí hay un blog con los aspectos más destacados: http://blog.jooq.org/2013/11/25/a-lesser-known-java-8-feature-generalized-target-type-inference/
Esto está relacionado con la Inferencia de tipos de un método genérico .
En caso de código antes ver. 8. Se debe declarar el tipo de resultado para este caso.
return retval == null ? Collections.<String>emptyList() : retval;
Desde ver. La noción de qué es un tipo de objetivo se ha expandido para incluir argumentos de método. Entonces esto ya no es requerido.