【发布时间】:2013-10-08 13:10:19
【问题描述】:
我在使用泛型时发现了一个奇怪的行为。
在 Foo<T> 这个类中,strings 成员与 T 没有任何关系:
package test;
import java.util.ArrayList;
public class Foo<T> {
ArrayList<String> strings;
T getSome() {
return null;
}
}
该类用于main:
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
}
}
编译错误是“不兼容的类型。必需:找到的字符串:对象”。
当使用 Foo 的原始类型时,Java 似乎忘记了 ArrayList 的 String 类型参数。
我的java版本是1.7.0_21
【问题讨论】:
-
这是完全正常的。原始类型是完全原始的(所有成员)。请搜索类似问题。
-
原始类型是为了向后兼容。来自java tutorial on raw types:“使用原始类型时,您基本上会获得预泛型行为”。如果 Foo 具有泛型成员(即使它不依赖于 T),则 Foo 的原始类型将不会向后兼容