Java 原始类型成员的泛型类型丢失

Java 原始类型成员的泛型类型丢失,java,generics,Java,Generics,在使用泛型时,我发现了一种奇怪的行为 在这个类Foo中,strings成员与t没有任何关系: package test; import java.util.ArrayList; public class Foo<T> { ArrayList<String> strings; T getSome() { return null; } } 封装测试; 导入java.util.ArrayList; 公开课Foo{ 数组列表字符串;

在使用泛型时,我发现了一种奇怪的行为

在这个类
Foo
中,
strings
成员与
t
没有任何关系:

package test;
import java.util.ArrayList;

public class Foo<T> {
    ArrayList<String> strings;

    T getSome() {
        return null;
    }
}
封装测试;
导入java.util.ArrayList;
公开课Foo{
数组列表字符串;
T getSome(){
返回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
    }
}
封装测试;
公共班机{
公共静态void main(){
Foo intFoo=新的Foo();
整数i=intFoo.getSome();
字符串s1=intFoo.strings.get(0);
Foo rawFoo=新Foo();
对象o=rawFoo.getSome();
String s2=rawFoo.strings.get(0);//此行出现编译错误
}
}
编译错误为“不兼容类型。必需:找到字符串:对象”

当使用
Foo
的原始类型时,Java似乎忘记了
String
type参数到
ArrayList


简单地说,我的java版本是1.7.0_21,因为
rawFoo
是原始的,所以它的非静态成员也会变成原始的

这一点概述如下:

更准确地说,原始类型定义为以下类型之一:

  • 引用类型,通过采用泛型类型声明的名称而形成,但不附带类型参数列表

  • 元素类型为原始类型的数组类型

  • 未从R的超类或超接口继承的原始类型R的非静态成员类型


注意最后一项。

这是完全正常的。原始类型是完全原始的(所有成员)。请搜索类似问题。原始类型用于向后兼容。来自:“当使用原始类型时,基本上得到了预泛型行为”。如果Foo的原始类型有一个泛型成员(即使它不依赖于T),那么它就不会向后兼容。最后一个项目符号实际上是指内部类(非静态成员类型),而不是字段。