簡體   English   中英

創建一個通用類型的數組

[英]Creating an array of generic type

假設我想通過默認構造函數創建一個長度為5的數組

public class A <E extends Comparable<? super E>> implements B<E>
{
     private E[] myArray;


     public A()
     {
         myArray = (E[]) new Object[5]; 
     }    

}

這是正確的做法嗎? 我很困惑,我是否必須在[]之前陳述“可比較”。 所以

 private  Comparable[] myArray;

不。 它將在運行時拋出ClassCastException

讓我們看看原因。 因為<E extends Comparable<? super E>> <E extends Comparable<? super E>> ,一旦所有泛型類型被編譯器擦除, E將被類中的Comparable替換。

因此,在您的構造函數中,這主要是在運行時發生的:

 myArray =  new Comparable[5];

這是錯誤的,因此是例外。

它將與class A <E> implements B<E>

所以解決方案是:

class A <E extends Comparable<? super E>> implements B<E>{
  Comparable[] array;
  public A(){
    array =  new Comparable[5];
   }
    @SuppressWarnings("unchecked")
   E get(int x)
   {
     return (E) array[x];
   }
   void add(E b){
     //for now
     array[0] = b;
   }

您發布的代碼的問題是E[]的擦除是Comparable[] (因為E的上限是Comparable ),因此將實際類型為Object[]Comparable[]將失敗。

您可以簡單地將其更改為以下內容,它不會拋出異常:

public class A <E extends Comparable<? super E>> implements B<E>
{
     private E[] myArray;


     public A()
     {
         myArray = (E[]) new Comparable[5]; 
     }    

}

但是,這里有更多的細微之處: myArray實際上不是E[]類型。 在課堂內, E[]被刪除為Comparable[] ,所以沒關系。 但是你必須確保永遠不要將myArray暴露給課外。 由於它是私有的,你只需要確保沒有方法返回它或什么。

這樣做的好處是,保持myArray類型為E[] ,而不是Jatin使用Comparable[]的答案,就是你不必每次從中獲取某些內容時都要進行轉換,因此代碼更好。

正如@Jatin指出的那樣,如果將Object強制轉換為Comparable ,則將獲得運行時異常,因為它是Comparable父級,因此無法強制轉換為子類型。

我建議你盡可能使用ArrayList

例如

public class A <E extends Comparable<? super E>> implements B<E> {
    private List<E> myArray;

     public A() {
         myArray = new ArrayList<E>(); 
     }    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM