在Java中的for-each循环中使用泛型时出现奇怪的编译器错误。这是一个Java编译器错误,还是我真的在这里错过了一些东西?为什么Java编译器抱怨使用foreach与原始类型?
这里是我的全班同学:
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);
}
}
}
编译器抱怨与换将线路:“类型不匹配无法从元素类型的对象转换为字符串”
如果我让这个微妙的变化,它编译:
public static void main(String...a){
Generics<?> generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
我知道getList()
不使用泛型,但它使用它们在我认为是一个完全无关的方式。我可以理解这一点,如果我试图迭代T类型的东西,并且getList()
返回了List<T>
什么的,但这不是这种情况。 getList()
的返回类型应该与T完全无关,不应该在乎我是否使用原始类型作为我的泛型对象或不是......对吗?这些不应该完全无关,还是我真的在这里错过了一些东西?
注意,代码也编译如果我这样做,我认为应该是等同于第一以及:
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);
}
}
''没有比'不同'。你不是在制作你的类的通用版本,而是在制作原始类型。这给我们带来了一个问题,为什么你的类是通用的?你使用T的唯一地方是在构造函数中,你不使用该引用。 –
unholysampler
2011-03-25 18:45:20
我用'',因为我只是需要一些例子。真正的代码显然是别的东西,它确实使用T ...它只是以与getList()完全无关的方式使用T。 –
2011-03-25 18:49:34
与你的问题无关,但我会让构造函数为泛型cls),所以你不必实例化一个类型为T的对象来构造这个Generics类。 – MeBigFatGuy 2011-03-25 19:55:26