2011-04-07 75 views
1
public class MergeSort 
{ 
    /** 
    * @param a Array to be sorted. 
    * @param n Last element to be sorted. 
    * @return void. 
    */ 
    public static <T extends Comparable<T>> void sort(T[] a, int n) 
    { 
    } 

    /** 
    * @param inp Input Array. 
    * @param out Output Array. 
    * @param first First index. 
    * @param mid Middle index. 
    * @param last Last index. 
    * @return void. 
    */ 
    private static <T extends Comparable<T>> 
      void merge(T[] inp, T[] out, int first, int mid, int last) 
    { 
    } 
} 

大家好,我需要一些幫助。問題:T [] b =(T [])new Object [n];

以上是我的教授給我們的提綱。我的問題是我想在sort方法中創建一個T [] b數組,所以當我將它們傳遞給merge方法時,我可以重用這兩個數組'a'和'b'。而不是每次我將它稱爲合併時創建一個臨時數組。我試過

T[] b = (T[]) new Object[n]; 

和類將編譯,但是當我打電話的那種方法,從我的主類整數數組我得到:

java.lang.ClassCastException:[Ljava.lang 。目的;不能轉換爲[Ljava.lang.Comparable;

我該怎麼辦? 任何幫助都會大大降低,如果我錯過了任何地方的答案,我的apoligies。我一直在尋找大部分時間。謝謝!

+0

請務必接受丹尼爾的回答。它促進了對問題的進一步回答,並給你一些業力! – Amy 2011-04-07 20:02:58

回答

4

那麼,簡單的答案是,在Java中,數組和泛型不能很好地一起玩。如您所知,Java泛型使用類型擦除來實現,這意味着在編譯時類型可能爲<T extends Comparable<T>>[],在運行時類型將被擦除到其下限,在本例中爲Comparable[](使用原始類型)。 T[]的類型是而不是實際上被擦除爲Object[],除非實際上是通用約束的下界。

這樣做的結果是,它應該是安全的,說:

@SuppressWarnings("unchecked") 
T[] b = (T[]) new Comparable<?>[n]; 

正如你所期望的一切應該工作。

請注意,如果您嘗試混合使用數組和泛型,實際上應該注意更多的注意事項。例如,通過使用通用通配符(例如<? extends T><? super T>),您可以使用泛型實現協變和逆變,但Java中的數組本身原生實現協變(並且在嘗試使其類型不變量失效時僅拋出ArrayStoreException)。所以如果你有能力從數組切換到泛型(例如ArrayList<T>可能會做你想做的),那麼你會發現事情更順利。

您也可能會發現這些鏈接有用:

+0

謝謝一百萬人。編寫迭代合併排序並不算太糟糕,但是這個問題讓我感到非常沮喪。保重並再次感謝! – user696046 2011-04-07 15:31:55

0

由於Object不能轉換爲T

T b = (T) new Object(); 

因此這不能不是真的要麼

T[] b = (T[]) new Object[n]; 

你可以看一下如何Collection.toArray(T[] a)實現創建T類型的新數組。

+0

我沒有downvote,但我不認爲你的推理是正確的。在很多情況下,從Object到T的轉換在編譯時是完全合法的(儘管它應該生成一個未經檢查的轉換警告),但是在運行時只會失敗並帶有ClassCastException。但是這與OP所面臨的實際問題無關,這與參數化類型和數組之間的二分法有關。 – 2011-04-07 06:32:23

+0

我同意你丹尼爾和未經檢查的警告是我所期待的,沒有例外,因爲我得到了。感謝Nr9的幫助。 – user696046 2011-04-07 15:30:14

+0

@ Nr9:你說得對,它不正確。但只要它在T的範圍內,它就不會崩潰。所以在實踐中,它可以使用。 – user102008 2011-08-31 03:21:15

相關問題