2017-01-18 39 views
2

我得到ClassCastException。我正在跟蹤這個答案,但沒有得到正確的答案。 Cast Object to Generic Type for returning
BubbleSort.java返回一些值的泛型類方法

import java.util.ArrayList; 
import java.util.List; 

public class BubbleSort<T extends Number> { 

    public List<T> list; 

    @SuppressWarnings("serial") 
    public BubbleSort() { 
     list = new ArrayList<T>() { 
     }; 
    } 

    public void add(T obj) { 
     list.add(obj); 
    } 

    public void sort() { 
     for (int i = 0; i < list.size(); i++) { 
      for (int j = 0; j < list.size() - 1; j++) { 
       if (list.get(j).intValue() > list.get(j + 1).intValue()) { 
        T swapElement = list.get(j); 
        list.set(j, list.get(j + 1)); 
        list.set(j + 1, swapElement); 
       } 
      } 
     } 
    } 

    public <T> T getArray(Class<T> clazz){ 
     T[] returnArray = (T[]) list.toArray(); 
     return clazz.cast(returnArray); 
} 

} 

MainPorgram.java

import java.lang.reflect.Array; 


public class MainProgram { 

    public static void main(String args[]){ 
     BubbleSort<Integer> bubbleSort = new BubbleSort<>(); 
     bubbleSort.add(new Integer(1)); 
     bubbleSort.add(new Integer(2)); 
     bubbleSort.add(new Integer(6)); 
     bubbleSort.add(new Integer(5)); 
     bubbleSort.add(new Integer(4)); 
     bubbleSort.add(new Integer(3)); 
     Class<Integer[]> intArrayType = (Class<Integer[]>) Array.newInstance(Integer.TYPE, 0).getClass(); 
     Integer[] sortedArray = (Integer[]) bubbleSort.getArray(intArrayType); 
     for(int i = 0 ; i < sortedArray.length; i++){ 
      System.out.println(sortedArray[i]); 
     } 
    } 

} 

控制檯

異常在線程 「主要」 java.lang.ClassCastException:不能投 [Ljava.lang 。目的;爲[我在java.lang.Class.cast(來源不明)在 BubbleSort.getArray(BubbleSort.java:32)在 MainProgram.main(MainProgram.java:15)

+1

_「並沒有得到它的權利」 _是不夠的。您需要發佈堆棧跟蹤,並指出程序中的哪一行會引發異常。同時告訴我們你已經做了什麼來解決問題。你是否在你的調試器中遍歷代碼? –

+0

這裏有很多錯誤。 – shmosel

+0

'(BubbleSort.java:32)'這意味着錯誤發生在BubbleSort.java的第32行。這是哪一行? –

回答

0

你有幾個問題。

主要問題是list.toArray()返回Object[],並且您不能將其轉換爲不同類型的數組。您應該使用<T> T[] toArray(T[] a)來獲取正確類型的數組。

代碼的另一個問題是,在方法<T> T getArray(Class<T> clazz)中聲明的通用參數隱藏了在類級別(class BubbleSort<T extends Number>)中聲明的同名通用參數。

這裏有一個修復建議的作品:

public T[] getArray(Class<T> clazz) { 
    return (T[]) list.toArray((T[])Array.newInstance (clazz, list.size())); 
} 

.... 

Integer[] sortedArray = bubbleSort.getArray(Integer.class); 
+0

不妨通過列表長度。另外,在'getArray()'中不需要外部轉換。 – shmosel

+0

@shmosel哦,你是對的。謝謝 – Eran

+0

@Eran謝謝老兄!我知道了 – user6556461

1

無法施展[Ljava.lang.Object;[I at ...

該消息可能令您感到困惑。這裏[Ljava.lang.Object;實際上是指Object[][I這個類型表示int[]。這些是可根據https://stackoverflow.com/a/8066268/224671解碼的Java 類型簽名


所以錯誤消息是抱怨你想投的Object[]int[]。在那裏你提到的int類型的唯一地方是這一行:

Class<Integer[]> intArrayType = 
      (Class<Integer[]>) Array.newInstance(Integer.TYPE, 0).getClass(); 

問題是你正在使用Integer.TYPE返回的int的類型,所以你得到的類將是Class<int[]>。使用實際的Integer類,寫:

Class<Integer[]> intArrayType = 
      (Class<Integer[]>) Array.newInstance(Integer.class, 0).getClass(); 
    //             ^~~~~ 

(爲差異見Difference between Integer.class and Integer.TYPE)。

注意,因爲你已經知道你會處理Integer[]類,你不需要調用.getClass() ,這就夠了:

Class<Integer[]> intArrayType = Integer[].class; 

但是這仍然是錯誤的,例如在

public <T> T getArray(Class<T> clazz){ 
    T[] returnArray = (T[]) list.toArray(); 

你會被斷言得到一個Integer[][](多的問題,我哪裏也不會去詳細)...爲適當修正見@Eran's answer

+0

你只解決了部分問題。它仍然返回Object []'。 – shmosel

+0

這隻會將錯誤更改爲'無法投射[Ljava.lang.Object;到[Ljava.lang.Integer;' – Eran

+0

上次編輯是不正確的。確實'T []'會是'Integer [] []',但是由於類型刪除,轉換被忽略。問題出現在下一行,其中'list.toArray()'[返回Object []'](https://docs.oracle.com/javase/8/docs/api/java/util/List.html #toArray--),它不能轉換爲Integer []。 – shmosel

2

有沒有在你的代碼比較嚴重的混亂和錯誤的假設。相反,詳細說明所有的人(有的已涵蓋在其他的答案),我會建議工作的辦法,就是要簡單得多,如果你對Java的8:

public class BubbleSort<T extends Number> { 

    public List<T> list; 

    public BubbleSort() { 
     list = new ArrayList<T>(); 
    } 

    //... 

    public T[] getArray(IntFunction<T[]> arrayGenerator) { 
     return list.stream().toArray(arrayGenerator); 
    } 
} 

public class MainProgram { 

    public static void main(String args[]) { 
     BubbleSort<Integer> bubbleSort = new BubbleSort<>(); 
     //... 
     Integer[] sortedArray = bubbleSort.getArray(Integer[]::new); 
     //... 
    } 
}