Obtuve un extraño error de compilación al usar genéricos dentro de un bucle for-each en Java. ¿Es esto un error del compilador de Java, o realmente me falta algo aquí?¿Por qué el compilador de Java se queja de utilizar foreach con un tipo sin formato?
Aquí es toda mi clase:
public class Generics<T extends Object> {
public Generics(T myObject){
// I didn't really need myObject
}
public List<String> getList(){
List<String> list = new ArrayList<String>();
list.add("w00t StackOverflow");
return list;
}
public static void main(String...a){
Generics generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
}
El compilador se queja de la línea con el para-cada uno: "No coincide el tipo no puede convertir de tipo de elemento de objeto de cadena."
Si realizo este cambio sutil, que compila:
public static void main(String...a){
Generics<?> generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
sé getList()
hace uso de genéricos, sino que los utiliza en lo que creía que era una manera completamente ajenos. Podría entender esto si estuviera tratando de iterar sobre algo de tipo T y getList()
devolvió un List<T>
o algo así, pero ese no es el caso aquí. El tipo de devolución de getList()
no debería tener absolutamente nada que ver con T y no debería importar si uso el tipo sin procesar para mi objeto Generics o no ... ¿no? ¿No deberían estos estar completamente sin relación, o realmente me estoy perdiendo algo aquí?
Tenga en cuenta que el código también compila si hago esto, por lo que pensé que debería haber sido equivalente a la primera, así:
public static void main(String...a){
Generics generics = new Generics(new Object());
List<String> list = generics.getList();
for(String s : list){
System.out.println(s);
}
}
'' no es diferente de '' . No estás haciendo una versión genérica de tu clase, estás haciendo el tipo sin procesar. Lo que nos lleva a la pregunta de por qué su clase es genérica en primer lugar. El único lugar donde usas T está en el constructor y no usas esa referencia. –
unholysampler
Utilicé '' porque solo necesitaba algo para un ejemplo. El código real obviamente es otra cosa, y usa T ... solo usa T de una manera completamente diferente a 'getList()'. –
no relacionado con su pregunta, pero haré que el constructor sea Generics cls) para que no tenga que instanciar un objeto de tipo T solo para construir esta clase de Generics. –
MeBigFatGuy