如果以非泛型方式使用Java泛型类,则该类将错过所有字段的泛型信息?



有一个泛型类:

class Test<T> {
T genericTypeField;
List<String> list;
}
void method1(Test test) {
for (String value : test.list) { // Compiler error
}
// Correct
for (Object value : test.list) {
}
}
void method2(Test<?> test) {
// Correct
for (String value : test.list) {
}
}

似乎如果以非泛型方式使用泛型类,则此类中的所有泛型字段都将丢失泛型信息。

Java规范对此有任何描述吗?

method1(Test test)中的test类型是raw type

这是 Java 中Raw types的正常行为。它在这里和那里都得到了很好的声明。对于您的案例,重要的注意事项是:

未继承自其超类或超接口的原始类型 C 的构造函数 (§8.8)、实例方法 (§8.4、§9.4) 或非静态字段 (§8.3) M 的类型是对应于与 C 对应的泛型声明中其类型的擦除的原始类型。

如果您不提供泛型类型,则始终将其作为对象

如果要使用字符串,请使用类似

void method1(Test<String> test) {
for (String value : test.list) { // This Compiler 
}
}

最新更新