java.lang.ClassCastException:[Ljava.lang.Object;无法转换为[Ljava.lang.String;

时间:2014-03-29 13:28:38

标签: java arrays dictionary

我需要将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)

3 个答案:

答案 0 :(得分:28)

无论泛型如何,

toArray()都会返回Object[]。您可以使用重载的变体:

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

或者,由于Set的{​​{1}}方法无法保证订单,并且您使用数组的所有内容都打印出值,您可以迭代{{1}直接:

toArray

编辑: 为了完成图片,在Java 8中,可以使用keySet()方法使代码更加优雅:

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

答案 1 :(得分:5)

返回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);
}

答案 2 :(得分:1)

toArray()方法在List接口中定义,因此每当存在List实例时,您也可以访问此方法。

首先,您可能会认为可以将一个对象数组转换为String数组,但其中的元素都是String数组,但java规范另有说明Link,简而言之:

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

&#34;工作&#34;在运行时,当且仅当B是A(或A本身)的子类型时。 B实际上是否只包含As是无关紧要的,也没有使用bArr的编译时类型(重要的是运行时类型):

在您的代码中致电:image_urls.toArray() 你会得到一个Object数组,因为Object不是String的SubType,你会得到异常。要执行此操作,请使用toArray()的其他重载 获取某种类型的数组(用于类型引用)作为&#34; Mureinik&#34;提及。