Java: как работает универсальное стирание - PullRequest
0 голосов
/ 25 марта 2012

Сценарий 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   
   } 
}

на самом деле объект [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]; 
  }
}

1 Ответ

6 голосов
/ 25 марта 2012

Причина, по которой Сценарий A является недопустимым, заключается в том, что ковариантные массивы Java не реализованы посредством стирания.Это:

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

вызовет ArrayStoreException во время выполнения, потому что foo относится к экземпляру массива, который знает , это String[](даже если на него ссылается переменная foo, которая имеет тип времени компиляции Object[]).Итак, это:

new V[4]

недопустимо, поскольку среда выполнения не будет знать, какой тип экземпляра массива создавать.

...