繁体   English   中英

Java:通用擦除的工作原理

[英]Java :How Generic Erasure Works

方案A.java -----------擦除后--------> M.class

场景B.java -----------擦除后--------> M.class

那么为什么A是非法的而B是合法的,因为擦除后它们的M几乎相同。

擦除前的方案A:

 class ArrayList<V> {
 private V[] backingArray;
         public ArrayList() {
             backingArray = new V[DEFAULT_SIZE]; // illegal
           }
 }

擦除后的方案A:

 class ArrayList<V> {   
   private Object[] backingArray;   
      public ArrayList() {
      backingArray = new Object[DEFAULT_SIZE]; // this is not useful   
   } 
}

实际上,Object [Default_Size]是有用的〜擦除前的情况B:

class ArrayList<V> {
  private V[] backingArray;
  public ArrayList() {
    backingArray = (V[]) new Object[DEFAULT_SIZE]; 
  }
}

删除后的情况B:

class ArrayList<V> {
  private Object[] backingArray;
  public ArrayList() {
    backingArray = (Object[]) new Object[DEFAULT_SIZE]; 
  }
}

方案A非法的原因是Java的协变量数组不是通过擦除实现的。 这个:

Object[] foo = new String[4];
foo[0] = new Object();

将在运行时引发ArrayStoreException ,因为foo表示知道它是String[]的数组实例(即使它是通过具有编译时类型Object[]的变量foo引用的)。 所以这:

new V[4]

这是非法的,因为运行时不知道要创建哪种类型的数组实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM