簡體   English   中英

將對象數組轉換為可比較的數組

[英]Casting array of objects to array of comparable

我在做在線算法課的作業時遇到了問題。 Object[]T[] ,其中T為Comparable會引發運行時異常

public  static <T extends Comparable<? super T>> void mergeSort(T[] xs) {
    T[] aux = (T[]) new Object[xs.length];
    mergeSort(xs, aux, 0, xs.length);
}

我可以用C#重寫它,它在創建泛型數組時沒有任何問題,但我寧願學習如何在Java中處理它。

如果您遇到運行時異常,則意味着您嘗試強制轉換的對象實際上沒有該類型。 語言與它沒有任何關系。 您的代碼中可能存在錯誤。

編輯:聽起來你對Java的類型系統如何工作感到困惑。 在C#中,泛型實際上在運行時表示不同的類型。 在Java中,通用類型在運行時不存在。 它們只是方便了更好的編譯時類型檢查。 在編譯期間,泛型在稱為類型擦除的過程中被實際類型替換。

通常,泛型類型的擦除是Object ,但由於您為T提供了上限,因此將其轉換為該綁定的Comparable 因此,擦除后,您的代碼看起來像這樣。

Comparable[] aux = (Comparable[]) new Object[xs.length];

換句話說,您正在創建一個Object[]類型的數組,並立即嘗試將其Comparable[]轉換為Comparable[]類型。 由於Object未實現Comparable ,因此類型不兼容,因此您將獲得運行時異常。 你可以通過創建一個Comparable數組來解決這個問題。

public  static <T extends Comparable<? super T>> void mergeSort(T[] xs) {
    T[] aux = (T[]) new Comparable[xs.length];
    mergeSort(xs, aux, 0, xs.length);
}

嘗試這個:

public  static <T extends Comparable<? super T>> void mergeSort(T[] xs) {
    T[] aux = (T[])java.lang.reflect.Array.newInstance(xs.getClass().getComponentType(), xs.length);
    mergeSort(xs, aux, 0, xs.length);
}

數組是協變的,這意味着它們在運行時保留其元素的類型。 Java的泛型不是。 所以基本上他們不混合。

另請參見: Java中的通用數組

您無法創建泛型數組,也無法轉換為它們。 最好使用arraylists。

暫無
暫無

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

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