Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读核心Java 11版时关于**类型擦除机制**的问题_Java_Types_Casting_Type Conversion_Jvm - Fatal编程技术网

读核心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) {}