【发布时间】:2011-07-23 03:22:33
【问题描述】:
在 Java 的 for-each 循环中使用泛型时,我遇到了一个奇怪的编译器错误。这是 Java 编译器的错误,还是我真的在这里遗漏了什么?
这是我的全班:
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);
}
}
}
编译器抱怨 for-each 行:“类型不匹配无法从元素类型 Object 转换为 String。”
如果我做出这个细微的改变,它会编译:
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 完全无关,并且不应该关心我是否将原始类型用于我的 Generics 对象......对吗?这些不应该是完全不相关的,还是我真的在这里遗漏了什么?
请注意,如果我这样做,代码也会编译,我认为这也应该等同于第一个:
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 extends Object>与<T>没有什么不同。您不是在制作类的通用版本,而是在制作原始类型。这给我们带来了一个问题,为什么你的类首先是通用的?您使用 T 的唯一地方是在构造函数中,并且您不使用该引用。 -
我使用了
<T extends Object>,因为我只是需要一些例子。真正的代码显然是别的东西,它确实使用了 T...它只是以与getList()完全无关的方式使用 T。 -
与您的问题无关,但我会将构造函数设为 Generics
cls),这样您就不必实例化 T 类型的对象来构造这个 Generics 类。 -
我真的只是想展示
<T extends *something*>,而不是把重点放在那是什么,所以我选择Object作为我的例子。
标签: java generics foreach raw-types