2017-07-31 42 views
1

我正在嘗試在Java中編寫BinarySearchTree的代碼。當我嘗試通過實例化Integer BST來測試它時,我不斷收到運行時錯誤。下面是相關的代碼:鑄造對象到相當的運行時錯誤

public class BinarySearchTree<E extends Comparable<E>> { 
    private E[] nodes; 

    @SuppressWarnings("unchecked") 
    public BinarySearchTree() { 
      nodes = (E[])new Object[10]; 
    } 
} 

現在,我此行的主要:

BinarySearchTree<Integer> test = new BinarySearchTree<Integer>(); 

當我運行代碼,我得到這個錯誤鏈接到構造函數的第一行:

[Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable; 

我不是很熟悉泛型,但我猜這是因爲Object沒有定義的compareTo方法?如果這條線不起作用,我還有什麼其他的選擇,這樣我可以有一個數組,可以以某種方式持有泛型Comparable類型?

+0

您在構造函數中也有編譯錯誤。請確保您發佈的調試代碼幫助編譯的代碼能夠重現您嘗試獲得幫助的問題! :) – nbrooks

+1

[如何在Java中創建通用數組?]可能的重複(https://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java) – nbrooks

+0

[本答案](https://stackoverflow.com/a/4221845/803925)特別應該是如何處理這種情況的一個很好的例子。你最終會做一些類似於'clazz.cast(Array.newInstance(clazz.getComponentType(),size))'的地方,其中'clazz'的類型爲'Class ',並且是你的構造函數的一個參數。當你調用它時你會傳入'Integer [] .class'。如果你使用的是集合而不是數組,那麼這會容易得多。 – nbrooks

回答

1

因爲數組的運行時類是[Object(作爲代碼「new Object [10]」),所以得到這個異常。由於Object是所有其他類的超類,因此不能將對象數組轉換爲任何其他類型的數組。

1.無法將A型陣列轉換爲B型陣列,但A是B'的子類。
2.事件將子類型數組轉換爲超類型數組,但該數組仍然只存儲子類型元素,因爲運行時類型仍爲[子類型。

你可以用下面的代碼試試:

public static void main(String[] args) { 
    Object[] arr = new Object[10]; 
    Integer[] irr = (Integer[]) arr;// error: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer; 
} 

public static void main(String[] args) { 
    Integer[] irr = new Integer[10]; 
    Object[] arr = irr; 
    arr[0] = new Object(); // java.lang.ArrayStoreException: java.lang.Object 
} 

至於你的情況,我認爲你應該編碼如下圖所示:

class BinarySearchTree<E extends Comparable<E>> { 
private Comparable<E>[] nodes; 

@SuppressWarnings("unchecked") 
public BinarySearchTree() { 
     nodes = new Comparable[10]; 
} 

public void add(E e, int index){ 
    nodes[index] = e; 
} 

@SuppressWarnings("unchecked") 
public E get(int index){ 
    return (E)nodes[index]; 
} 
} 
1

E[]擦除是Comparable[](因爲上限的EComparable<E>),因此在運行時將轉換爲Comparable[],由於該對象的實際運行時類型爲Object[],因此該操作失敗。您可以通過創建Comparable[]來代替此問題來解決此問題:

nodes = (E[])new Comparable[10];