有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java铸造一套

有人能告诉我下面的代码有什么问题吗

    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)

提前谢谢


共 (3) 个答案

  1. # 1 楼答案

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

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

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

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

  2. # 2 楼答案

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

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

    看看Java教程中关于泛型的演练。这对你来说很重要,但在使用Collections软件包时却非常宝贵

    Java Tutorials: Lesson Generics

  3. # 3 楼答案

    尝试传递type引用

    String[] cmdarr = cmds.toArray(new String[0]);