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),那么它就不会向后兼容。最后一个项目符号实际上是指内部类(非静态成员类型),而不是字段。