基于java文档:
在类型擦除过程中,Java 编译器擦除所有类型参数,如果类型参数是有界的,则将每个类型参数替换为其第一个边界,如果类型参数是无界的,则将其替换为 Object。
现在,事情是这样的:
public class MyCreator<T> {
Class<T> kind;
MyCreator(Class<T> kind) {
this.kind = kind;
}
void printInstanceClass() throws Exception{
System.out.println(kind.newInstance().getClass());
}
public static void main(String[] args) throws Exception{
MyCreator<String> myCreator = new MyCreator<String>(String.class);
myCreator.printInstanceClass();
}
}
该printInstanceClass()
方法实际上是打印“class java.lang.String”。
如果编译器将类中的 T 替换为 Object,我猜想与 Class 关联的信息也会kind
被删除并替换为 Class。那么,该方法如何newInstance()
返回一个 String 实例而不是一个 Object 实例呢?