如果您得到一個運行時異常,這意味着您嘗試投射的對象不會實際使用該類型。語言與它沒有任何關係。您的代碼中可能存在一個錯誤。
編輯:聽起來好像你對Java的類型系統的工作方式感到困惑。在C#中,泛型實際上在運行時表示不同的類型。在Java中,泛型類型在運行時不存在。它們只是一個方便,可以更好地編譯時間類型檢查。在編譯過程中,泛型在被稱爲類型擦除的過程中被實際類型所取代。
通常,刪除一個通用類型爲Object
,但由於您提供了T
的上限,因此將其轉換爲該綁定的Comparable
。因此,擦除後,你的代碼看起來像這樣。
Comparable[] aux = (Comparable[]) new Object[xs.length];
。換句話說,你要創建Object[]
類型的數組,並立即試圖將它轉換爲類型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);
}
我想你應該看到http://stackoverflow.com/questions/1817524/generic-arrays-in-java 這是相當有趣的。 –