web-dev-qa-db-ja.com

java.lang.ClassCastException:[Ljava.lang.Object; [Ljava.lang.String;にキャストできません。

HashMapをString配列に変換する必要があります。私のJavaコード

import Java.util.HashMap;
import Java.util.Map;

public class demo {

    public static void main(String[] args) {

        Map<String, String> map1 = new HashMap<String, String>();

        map1.put("1", "1");
        map1.put("2", "2");
        map1.put("3", "3");

        String[] str = (String[]) map1.keySet().toArray();

        for(int i=0; i<str.length;i++) {
            System.out.println(str[i]);
        }
    }
}

コードを実行すると、次のClassCastExceptionが取得されます。

Exception in thread "main" Java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at demo.main(demo.Java:17)
18
JackSun

toArray()は、ジェネリックに関係なく_Object[]_を返します。代わりにオーバーロードされたバリアントを使用できます。

_String[] str = map1.keySet().toArray(new String[map1.size()]);
_

あるいは、SettoArrayメソッドは順序についての保証を与えず、配列を使用しているのは値を出力するだけなので、keySet()を繰り返すことができます。直接:

_for (String str: map1.keySet()) {
    System.out.println(str);
}
_

編集:Java 8)の図を完成させるために、foreachメソッドを使用してコードをよりエレガントにすることができます。

_map1.keySet().forEach(System.out::println);
_
30
Mureinik

Object[]ではなくString[]ではありません。これを試して:

Object[] obj = (Object[]) map1.keySet().toArray();
for(int i=0; i<obj.length;i++) {
    String someString = (String)obj[i];
    System.out.println(someString);
}
5
Sabuj Hassan

toArray() methodはListインターフェイスで定義されているため、Listのインスタンスが存在するすべての場所で、このメソッドにアクセスできます。

最初は、その要素がすべてString型であるObjectの配列をString配列にキャストできますが、Java specsはそうではありません Link 、要するにそれは言います:

bArr = new B[]; A[] aArr = (A[]) bArr;

BがA(またはA自体)のサブタイプである場合にのみ、実行時に「動作」します。 Bが実際にAsのみを含むかどうかは無関係であり、bArrのコンパイル時タイプも使用されません(重要なのはランタイムタイプです)。

呼び出し元のコードでは、image_urls.toArray()を使用してObjectの配列を取得します。ObjectはStringのSubTypeではないため、例外が発生します。この書き込みを行うには、toArray()の他のオーバーロードを使用します。これは、「Mureinik」に記載されているように、特定の型の配列(型参照用)を取得します。

1
Mr.Q