在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