【问题标题】:Why it is not possible to cast the result of Arrays.asList() to ArrayList? [duplicate]为什么不能将 Arrays.asList() 的结果转换为 ArrayList? [复制]
【发布时间】:2021-01-28 08:38:32
【问题描述】:

Arrays.asList 的返回类型是 List 并将其转换为 ArrayList 会引发错误。 ArrayList 是 List 的子实现类。所以,将 List 转换为 ArrayList 将是向下转换的。那为什么第一行下面会抛出运行时错误。

ArrayList<String> list  = (ArrayList<String>) Arrays.asList("Amit","Suneet","Puneet");// Run time Error
List<String> list2 = new ArrayList<>(list);

错误:

线程“main”java.lang.ClassCastException 中的异常:java.util.Arrays$ArrayList 无法转换为 java.util.ArrayList

我们不能用接口和实现类进行向下转换吗?如果可以那怎么办?

【问题讨论】:

  • 向下转换并不总是成功,你知道的。
  • 我认为这是一个值得更多考虑的有趣问题。答案stackoverflow.com/a/64344883/348975 提出了一个明显的问题,为什么 java 实现者要创建两个 ArrayList 实现。 java.util.Arrays.ArrayList(私有)和 java.util.ArrayList。如果不阅读代码,我觉得这很愚蠢。
  • @emory,这应该是一个单独的问题。重复发布的问题非常直接地回答了。
  • 然而,一般来说你不应该沮丧。这是一种不好的编码习惯,应该避免。

标签: java arraylist collections interface downcast


【解决方案1】:

如果实际被引用的对象是SubFoo 类型,您可以Foo 向下转换为SubFoo。如果对象的类型为OtherSubFoo,您将获得ClassCastException

这就是这里的情况。有一个名为java.util.Arrays.ArrayList 的类(应该是私有的),它与java.util.ArrayList 不同。该对象的类型为java.util.Arrays.ArrayList,因此不能转换为java.util.ArrayList。同样的事情也会发生,例如,如果它是 LinkedList

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2020-03-27
    • 2019-10-04
    相关资源
    最近更新 更多