[英]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.