2014-12-06 38 views
2

我試圖訂購一個二叉搜索樹,並將其值存儲在一個數組上,但是當我嘗試將我的ArrayList轉換爲數組時,它說我無法將一個對象轉換爲Comparable。不能將對象轉換爲可比較

@Override 
public T[] postOrder() { 
    ArrayList<T> array = new ArrayList<T>(); 
    postOrder(root, array); 
    return (T[]) array.toArray(); 
} 

private void postOrder(BSTNode<T> currRoot, ArrayList<T> array) { 
    if (currRoot == null) 
     return; 
    if (!currRoot.getLeft().isEmpty()) 
     postOrder((BSTNode<T>) currRoot.getLeft(), array); 
    if (!currRoot.getRight().isEmpty()) 
     postOrder((BSTNode<T>) currRoot.getRight(), array); 
    array.add(currRoot.getData()); 
} 

錯誤消息: 異常在線程 「主要」 java.lang.ClassCastException:[Ljava.lang.Object;不能轉換爲[Ljava.lang.Comparable;

編輯:解決這樣

public T[] postOrder() { 
    ArrayList<T> array = new ArrayList<T>(); 
    postOrder(root, array); 
    return array.toArray((T[]) Array.newInstance(root.getData().getClass(), size())); 
} 

回答

4

[Ljava.lang.Object少解釋;不能轉換爲[Ljava.lang.Comparable;

這意味着您正在嘗試將Object[]轉換爲Comparable[]。 (「[L」表示陣列。)

toArray返回Object[]。你可能能代替<T>toArray(T[]);然而,由於type erasure你不能做

//     cannot do 
//     vvvvv 
return array.toArray(new T[ mySize ]); 

因此,無論

  • 你的樹需要Class<T>
  • 來電者需要通過T[]來填寫。需要返回非泛型數組。 (Object[] ... Comparable[] ...)
  • 您應該退回List<T>而不是T[]

我注意到你正在使用@Override所以也許你的超類型(接口,超類)有如何實現這個方法的說明。 (也就是說,如果這是家庭作業,你應該問你的老師,因爲它是我不清楚你應該使用哪種解決方案。)

如果你碰巧有一個Class<T>,那麼你可以做

@Override 
public T[] postOrder() { 
    ArrayList<T> array = new ArrayList<T>(); 
    postOrder(root, array); 
    return (T[]) array.toArray(
     java.lang.reflect.Array.newInstance(myClassT, array.size()) 
    ); 
} 

否則你需要更改方法的簽名。

又見

+0

大詳細的說明,但沒有解決......我的是相反的:) – TWiStErRob 2014-12-06 21:48:07

+0

@TWiStErRob的OP使用'@ Override'所以他們顯然已經」 t改變方法簽名。我個人並不確定要告訴他們什麼。 – Radiodef 2014-12-06 21:49:10

+0

我在我的代碼中使用了@ @ Override,但我也定義了接口。即使他不能修改接口,也可以像引用的問題那樣在構造函數中傳入'Class '實例! – TWiStErRob 2014-12-06 21:51:47

1

通用陣列凌亂,你需要調用其他方法toArray()

public T[] postOrder(T[] result) { 
    ArrayList<T> array = new ArrayList<T>(); 
    postOrder(root, array); 
    return array.toArray(result); 
} 

不要緊,結果是什麼規模,只是讓確定你以後不會使用傳入的內容,因爲如果大小不正確,它可能會在toArray內重新分配,因此只能使用返回值postOrder

想想看,如果你只是返回List<T>,並且讓調用者把它轉換爲一個數組,它可能會更清潔!請注意,有多少是需要返回List ...

public List<T> postOrder() { 
    ArrayList<T> array = new ArrayList<T>(); 
    postOrder(root, array); 
    return array; 
}