使用泛型時我發現了一個奇怪的行爲。原始類型成員丟失的泛型類型
在這個類Foo<T>
,在strings
成員沒有任何與T
:
package test;
import java.util.ArrayList;
public class Foo<T> {
ArrayList<String> strings;
T getSome() {
return null;
}
}
類是主要用於:
package test;
public class Main {
public static void main() {
Foo<Integer> intFoo = new Foo<>();
Integer i = intFoo.getSome();
String s1 = intFoo.strings.get(0);
Foo rawFoo = new Foo();
Object o = rawFoo.getSome();
String s2 = rawFoo.strings.get(0); // Compilation error on this line
}
}
的編譯錯誤是「不兼容的類型。required:String found:Object「。
當使用原始類型Foo
時,Java似乎忘記了String
類型參數爲ArrayList
。
我的Java版本爲1.7.0_21
這是完全正常的。原始類型完全是原始的(所有成員)。請搜索類似的問題。 –
原始類型是爲了向後兼容。從[原始類型的java教程](http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html):「使用原始類型時,您基本上會獲得預先泛型行爲」。如果Foo的原始類型具有通用成員(即使它不依賴於T),它將不會向後兼容 –