java.lang.classcastexception:[ljava.lang.object;无法转换为[ljava.lang.string;

n7taea2i  于 2021-06-27  发布在  Java
关注(0)|答案(3)|浏览(552)

我需要转换hashmap到一个字符串数组,下面是我的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)
2ic8powd

2ic8powd1#

toArray() 返回一个 Object[] ,不考虑泛型。您可以改用重载变量:

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

或者,因为 SettoArray 方法不能保证顺序,而且您使用数组的目的只是打印出值,您可以迭代 keySet() 直接:

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

编辑:为了完成图片,在Java8中 foreach 方法可以使代码更加优雅:

map1.keySet().forEach(System.out::println);
v6ylcynt

v6ylcynt2#

toArray() 方法是在列表接口中定义的,所以在每个有列表示例的地方,您都可以访问该方法。
一开始,您可能认为可以将一个对象数组(其所有元素都是string类型)强制转换为一个string数组,但java规范中另有规定,即link,简而言之: bArr = new B[]; A[] aArr = (A[]) bArr; 当且仅当b是a(或a本身)的子类型时,在运行时“起作用”。b实际上是否只包含as是不相关的,也不使用barr的编译时类型(重要的是运行时类型):
在代码中调用: image_urls.toArray() 您将得到一个object数组,因为object不是string的子类型,所以会得到exception。为此,请使用 toArray() 它获取一个特定类型的数组(用于类型引用),如“mureinik”所述。

kzmpq1sx

kzmpq1sx3#

它回来了 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);
}

相关问题