如果Java泛型类以非泛型方式使用,它将丢失所有字段的泛型信息?

如果Java泛型类以非泛型方式使用,它将丢失所有字段的泛型信息?,java,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(

有一个泛型类:

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) {

    }
}
类测试{
T型域;
名单;
}
无效方法1(测试){
对于(字符串值:test.list){//编译器错误
}
//正确的
for(对象值:test.list){
}
}
无效方法2(试验){
//正确的
for(字符串值:test.list){
}
}
如果以非泛型方式使用泛型类,则该类中的所有泛型字段都将丢失泛型信息


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

方法1(测试测试)中的
测试类型是
原始类型

这是Java中
原始类型的正常行为。这是很好的声明和声明。您的案例的重要注意事项是:

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


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

如果要使用字符串,请使用like

   void method1(Test<String> test) {
     for (String value : test.list) { // This Compiler 
     }
   }
void方法1(测试){
对于(字符串值:test.list){//此编译器
}
}

为什么要在类之外定义方法?同时发布整个编译器错误message@Ramanlfc我认为这些方法不在类内。它们是使用测试类的独立方法。发生这种情况的具体原因是规范中的这一行:“构造函数的类型(§8.8)、实例方法(§8.4、§9.4)或非静态字段(§8.3)对于未从其超类或超接口继承的原始类型C,其原始类型对应于在与C对应的泛型声明中删除其类型的原始类型。“@Powerlord感谢您的信息,同时更新了我的ans。