[英]Generic array - Unchecked cast from Object[] to T[]
我對Java非常陌生,已經閱讀了有關類型轉換的一些常規信息,這可能是解決我的問題的方法。 而且我想我確實掌握了這個概念-就像只有一種方法想使用而這是針對另一類的方法一樣。 但是我無法將其應用於帶有通用數組的我自己的代碼,因為我不知道在哪一點進行強制轉換以及哪種方法,或者我是否必須進行循環才能發送整個數組?
這是我的mergesort算法,如果不是通用類型的話,應該可以正常工作...
package src;
import java.util.Arrays;
public class MergeSort {
// sort array of type T using the Mergesort algorithm
public static <T extends Comparable<T>> T[] sort(T[] arr) {
@SuppressWarnings("unchecked")
T[] leftArray = (T[]) new Comparable[12]; // ERROR: Type safety: Unchecked cast from
// Object[] to T[]
@SuppressWarnings("unchecked")
T[] rightArray =(T[]) new Comparable[12]; // ERROR: Type safety: Unchecked cast from
// Object[] to T[]
if (arr.length > 1) {
int half = arr.length / 2;
leftArray = Arrays.copyOfRange(arr, 0, half);
rightArray = Arrays.copyOfRange(arr, half + 1, arr.length);
}
return merge( sort(leftArray), sort(rightArray));
}
private static <T extends Comparable<T>> T[] merge(T[] leftArray, T[] rightArray) {
@SuppressWarnings("unchecked")
T[] tempArray = (T[]) new Comparable[12]; // ERROR: Type safety: Unchecked cast from
// Object[] to T[]
int i = 0;
int leftIndex = 0;
int rightIndex = 0;
while ( leftIndex < leftArray.length || rightIndex < rightArray.length ) {
if ( leftIndex < leftArray.length && rightIndex < rightArray.length ) {
if (leftArray[leftIndex].compareTo(rightArray[rightIndex]) < 0 ) {
tempArray[i] = leftArray[leftIndex] ;
leftIndex++;
}
else {
tempArray[i] = rightArray[rightIndex] ;
rightIndex++;
}
}
else if ( leftIndex < leftArray.length ) {
tempArray[i] = leftArray[leftIndex] ;
leftIndex++;
}
else if ( rightIndex < rightArray.length ) {
tempArray[i] = rightArray[rightIndex] ;
rightIndex++;
}
} // end while
return tempArray;
}
public static void main(String[] args) {
// Edit this line to check with different values for the array
// or add more unit tests to test/MergeSortTest.java
// // sort list of Characters
Character[] charArr = { 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r',
'l', 'd', '!' };
charArr = MergeSort.<Character> sort(charArr);
System.out.println(Arrays.toString(charArr));
// sort list of Integers
Integer[] intArr = { 23, 4, 15, 8, 42, 16 };
intArr = MergeSort.<Integer> sort(intArr);
System.out.println(Arrays.toString(intArr));
}
}
任何建議將不勝感激!
不幸的是,您對此無能為力。 由於類型擦除,可用於查看強制轉換是否可以工作的類型信息丟失了,因此必須將檢查推遲到運行時,在運行時,可能引發ClassCastException
,從而終止程序。 由於編譯器無法證明不會發生這種情況,因此它發出警告。
還有一件事-您的代碼仍然會失敗。 類型被擦除為其邊界類型,在這種情況下為Comparable
。 因此,如下代碼:
T[] leftArray = (T[]) new Object[12];
對此擦除:
Comparable[] leftArray = (Comparable[]) new Object[12];
並且由於Object
沒有實現Comparable
,因此強制轉換將失敗。
解決方案是創建Comparable
數組:
T[] leftArray = (T[]) new Comparable[12];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.