【问题标题】:list.toArray() agrees to transfer items of type A to an array of type B[]list.toArray() 同意将 A 类型的项目传输到 B[] 类型的数组
【发布时间】:2014-08-21 17:57:31
【问题描述】:

我有以下代码:

private double doThings(List<ClassA> list){
    ClassB[] array = list.toArray(new ClassB[0]);
    // ...
}

这编译。为什么?

【问题讨论】:

  • docs.oracle.com/javase/7/docs/api/java/util/…ArrayStoreException - 如果指定数组的运行时类型不是此列表中每个元素的运行时类型的超类型。
  • @Nambari 我明白了。你可能想把它作为一个答案。谢谢

标签: java arrays list generics


【解决方案1】:

基于javadoc

ArrayStoreException - 如果指定数组的运行时类型不是此列表中每个元素的运行时类型的超类型。

【讨论】:

    【解决方案2】:

    java.util.List 源码很有意思:

    http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/List.java

    该类按类型是通用的:

    public interface List<E> extends Collection<E> 
    

    但是,toArray 方法是由不同的类型参数化的:

    <T> T[] toArray(T[] a);
    

    这是一个泛型方法,它使用与类本身不同的类型作为参数。 T 和 E 之间没有联系。这就是为什么您可以在 toArray 方法中使用不同类型的参数而不是用于参数化列表的类。

    找到这种设计背后的原因会很有趣。乍一看,有点奇怪。

    【讨论】:

      【解决方案3】:

      无法声明该方法来防止ArrayStoreException 的可能性。即使该方法被声明为具有参数类型A[],您仍然可以将其运行时类型为SubClassOfA[] 的数组传递给它,如果列表中有A 对象,那么它将导致ArrayStoreException,因为它们不能存储在SubClassOfA[]

      既然没有办法避免,还要看程序员能不能用得好,不如把方法尽量通用,取任意类型的数组。正确使用时(即当我们知道所有对象也是B 的实例时),它不会导致ArrayStoreException

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 2017-12-28
        • 2022-11-07
        • 2016-04-27
        • 2012-06-11
        相关资源
        最近更新 更多