1

有人可以告诉我以下代码有什么问题吗?

    Set<String> cmds = *a method call that returns a Set<String>*
    String[] cmdarr = (String[]) cmds.toArray();
    int i;
    for(i=0; i<cmdarr.length;i++){
        System.out.println(cmdarr[i]);

它给出了以下错误:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at a.jim.Test.main(Test.java:79)

提前致谢!

4

3 回答 3

5

Set本身在运行时没有关于其元素的任何类型信息;类型参数<String>在编译期间被擦除。因此,该toArray()方法总是创建一个类型为 的数组Object[]

您可以将数组传递给方法并将集合的内容复制到其中:

String[] cmdarr = cmd.toArray(new String[cmd.size()]);

您传入的数组太小,将使用反射创建具有相同组件类型的新数组,但这不如传入正确大小的数组有效。

于 2012-05-21T01:43:50.540 回答
1

尝试传递类型引用。

String[] cmdarr = cmds.toArray(new String[0]);
于 2012-05-21T01:43:22.743 回答
0

借鉴@erickson 所说的,其中的参数化类型Set只是编译时安全检查。代码编译后,Set<String>实际上变成SetObjects.

强制转换是一种在运行时实现更高特异性的方法。正如上一段所述,由于泛型类型在编译时会发生所谓的“类型擦除”,但您会收到编译时错误。您的cmdarr引用实际上只是类型对象的占位符String[]。这个占位符永远不能指向 aObject[]就像Set<List>占位符永远不能指向 a一样Set<ArrayList>

查看 Java 教程中有关泛型的演练。在使用 Collections 包时,您需要花费很多精力,但非常宝贵。

Java 教程:课程泛型

于 2012-05-21T02:26:09.667 回答