读核心Java 11版时关于**类型擦除机制**的问题
这是作者在书中提供的关于泛型编程的代码示例:读核心Java 11版时关于**类型擦除机制**的问题,java,types,casting,type-conversion,jvm,Java,Types,Casting,Type Conversion,Jvm,这是作者在书中提供的关于泛型编程的代码示例: public class Pair<T> { private T first; private T second; public Pair() { first = null; second = null; } public Pair(T first, T second) { this.first = first; this.second = second; } public T getFirst() { return
public class Pair<T>
{
private T first;
private T second;
public Pair() { first = null; second = null; }
public Pair(T first, T second) { this.first = first; this.second = second; }
public T getFirst() { return first; }
public T getSecond() { return second; }
public void setFirst(T newValue) { first = newValue; }public void setSecond(T newValue) {
second = newValue; }
}
因此,如果我们运行代码吹,打印是真的
Pair<Integer> p = new Pair<Integer>(1, 2);
Pair<String> s = new Pair<String>("a", "b");
System.out.println(p.getClass()==s.getClass());
参数类型变为Object,因此:
编译器如何判断类型是否错误?或何时发生类型擦除?类型擦除发生在编译器生成字节码时,但编译器在验证源代码时知道泛型类型。在那一点上还没有任何东西被抹去 然而,编译器知道即使在验证期间也会发生擦除。例如,如果您重载这样的方法:
void doStuff(List<Integer> intList) {}
void doStuff(List<String> stringList) {}
void doStuff(List intList){
void doStuff(List stringList){}
编译器知道这两个方法在擦除后都将void doStuff(List xxx){}
,并且不能有两个具有相同签名1的方法,因此验证步骤将为此生成错误消息,即使类型擦除尚未发生
1) 参数名称不是签名的一部分何时发生类型擦除?编译之后。不,它发生在编译期间,但编译器没有忘记原始声明@JohannesKuhnIts还值得注意的是,编译器在默认情况下会将一些泛型类型信息保存到生成的类文件中,但只保存类和成员的泛型类型信息,所以即使在运行时也可以找到字段/方法的泛型类型。但是,除了反射之外,运行时并不真正使用这些信息,而且它还允许编译器在以后了解这些泛型类型,即使您依赖于一些已经编译的代码。因为我认为这是OP丢失的信息的一部分。
Pair<String> s = new Pair<String>("a", 1);
public Pair(Object first, Object second)
{
this.first = first;
this.second = second;
}
void doStuff(List<Integer> intList) {}
void doStuff(List<String> stringList) {}