【问题标题】:Trying to cast setInstance.toArray() to Integer[], no compile time error but there is run time error, why?尝试将 setInstance.toArray() 转换为 Integer[],没有编译时错误但有运行时错误,为什么?
【发布时间】:2016-03-10 03:29:28
【问题描述】:

我正在试验 Java HashSet 类及其 toArray() 方法。下面是我想出的代码。编译器没有显示任何错误,但是当我运行代码时,IDE 会输出错误消息:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
    at JTOCollection.TheCollectionInterface.main(TheCollectionInterface.java:26)
Java Result: 1

由于我的经验不足,我无法完全理解错误消息背后的完整原因,有人可以解释一下吗?

Set<Integer> set1 = new HashSet<>();
set1.add(1);
set1.add(2);
set1.add(3);
set1.add(2);

Integer[] intArray = (Integer[]) set1.toArray();
for(Integer i : intArray){
    System.out.println(i);
}

【问题讨论】:

    标签: java casting set toarray


    【解决方案1】:

    因为您使用的是public Object[] toArray() 而不是public &lt;T&gt; T[] toArray(T[] a)

    使用这个:

    Integer[] intArray =  set1.toArray(new Integer[set1.size()]);
    

    文档:public &lt;T&gt; T[] toArray(T[] a)

    返回一个包含此集合中所有元素的数组; 返回数组的运行时类型是指定数组的运行时类型。 如果集合适合指定的数组,则在其中返回。 否则,将分配一个具有运行时类型的新数组 指定数组和此集合的大小。

    【讨论】:

    • 演员阵容有必要吗?
    • @kirbyquerby 哎呀刚刚从 OP 复制了它
    • 如果您传递给方法的整数数组的长度与 set1 相同,那么它的速度会更快,因为不再需要调整大小。如果您经常转换数组,使用Integer[] intArray = set1.toArray(new Integer[set1.size()]); 会带来微小的改进。
    • 是的,正确调整数组大小。
    【解决方案2】:

    set1.toArray() 是 Object[],不能转换为 Integer[]。如果你想要一个 Integer[] 试试这个:

    Integer[] intArray = set1.toArray(new Integer[set1.size()]);
    

    【讨论】:

    • 尺寸不正确的阵列的反射结构非常讨厌。你应该使用的成语是set1.toArray(new Integer[set1.size()])
    • @erickson 感谢您的改进
    【解决方案3】:

    方法 set1.toArray() 返回 Object[],你需要将返回数组中的每个对象显式地转换为 Integer。下面的代码将为您工作。

    Set<Integer> set1 = new HashSet<>();
        set1.add(1);
        set1.add(2);
        set1.add(3);
        set1.add(2);
    
        Object[] intArray = set1.toArray();
        for(Object i : intArray){
            System.out.println(i);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 2013-08-14
      相关资源
      最近更新 更多