use*_*059 2 java generics compilation
import java.util.*;
public class Main <T> {
public void guru(List<Integer> list) {
System.out.println("INteger");
}
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
new Main().guru(list);
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,调用
guru(List<String>); //no type erasure during compiling...
Run Code Online (Sandbox Code Playgroud)
应该导致编译失败.
如果我们用以下方法创建对象会发生什么:
new Main<Integer>() //or any other type
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这里发生了什么?这是JDK中的错误或没有参数实例化参数化对象可能会导致这样的问题,为什么?
我可以补充说,如果我们将主要定义更改为:
public class Main {
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,编译失败了.
问题出在这里:
new Main().guru(list);
^^^^
Run Code Online (Sandbox Code Playgroud)
您使用原始版本Main(没有泛型),因此忽略所有通用信息.你应该得到编译器警告.
如果你试试:
new Main<SomeType>().guru(list);
Run Code Online (Sandbox Code Playgroud)
你应该得到一个编译错误.
更准确地说,当使用原始类型:时new Main(),执行类型擦除,这不仅会删除类型本身的一般信息,还会从其方法中删除:
原始类型C [...]的构造函数(第8.8节),实例方法(第8.4节,第9.4节)或非静态字段(第8.3节)M的类型是对应于擦除的原始类型.它在与C对应的泛型声明中的类型