簡體   English   中英

通用數組-從Object []到T []的未經檢查的轉換

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

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