Me encontré con algo que no entiendo. ¿Por qué no es legal para cada bucle debajo cuando el segundo es idéntico?Genéricos de Java y tipos de devolución
public interface SomeInterface<T> {
List<SomeNamedObject> getObjects();
void doSomething(P1 p1, T p2);
}
public class SomeNamedObject {
private String text;
}
public class Clazz {
private SomeInterface someInterface;
...
public void someMethod() {
// Error Type mismatch: cannot convert from element type Object to TestClass.SomeNamedObject
for (SomeNamedObject someNamedObject : someInterface.getObjects()) {
// This loop won't compile as the someInterface.getObjects returns just a List and not a List<SomeNamedObject>
}
// Warning Type safety: The expression of type List needs unchecked
// conversion to conform to List<TestClass.SomeNamedObject>
List<SomeNamedObject> objects = someInterface.getObjects();
for (SomeNamedObject someNamedObject : objects) {
// This loop compiles
}
}
}
No es un error, es un problema con el borrado y los tipos crudos. – Stefan
No veo cuál podría ser el problema. ¿Puedes publicar el rastro de la pila real (solo las primeras líneas). Supongo que su clase completa requiere "SomeInterface", pero el ejemplo no requiere el "" ¿Quizás hay algo allí? –
Jay
@Jay su declaración de someInterface no especifica el tipo genérico, Java vuelve a los tipos crudos y la firma del método cambia para devolver una Lista sin formato (ver respuestas). Debería haber mencionado la advertencia en la asignación de objetos aunque. – Stefan