2017-01-18 6 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 .Object; MainProgram.main(MainProgram.java:15)で BubbleSort.getArray(BubbleSort.java:32)でjava.lang.Class.cast(不明なソース)で[Iに

+1

_「右のそれを取得できませんでした」_不十分である。スタックトレースを送信し、プログラムのどの行が例外をスローするかを示すことが期待されます。また、問題を解決するために行ったことを教えてください。デバッガのコードをステップ実行しましたか? –

+0

ここには非常に多くのことが間違っています。 – shmosel

+0

'(BubbleSort.java:32)'これはBubbleSort.javaの32行目でエラーが発生したことを意味します。これはどちらの行ですか? –

答えて

0

いくつか問題があります。

主な問題はlist.toArray()Object[]を返し、別のタイプの配列にキャストできないことです。正しいタイプの配列を取得するには、<T> T[] toArray(T[] a)を使用する必要があります。

コードのもう1つの問題は、メソッド<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

@エランおかげだよ!わかった – user6556461

1

[Ljava.lang.Object;をキャストすることはできません〜[I at

メッセージがあなたを混乱させる可能性があります。ここで、[Ljava.lang.Object;は実際にはObject[][Iの意味はint[]を意味します。これらは、Java タイプのシグニチャであり、https://stackoverflow.com/a/8066268/224671に従ってデコードできます。


ので、エラーメッセージがint[]Object[]をキャストしようとしている不平を言っています。

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

問題は、あなたがintの型を返すInteger.TYPEを使用しているので、あなたが得るクラスがClass<int[]>になりますです:あなたは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

これは、エラーを「Can not cast [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); 
     //... 
    } 
} 
関連する問題