有一个泛型类:
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
}
}