java列表。toArray()同意将类型A的项转移到类型B[]的数组中
我有以下代码:
private double doThings(List<ClassA> list){
ClassB[] array = list.toArray(new ClassB[0]);
// ...
}
这是一份汇编。为什么?
你可以在下面搜索框中键入要查询的问题!
我有以下代码:
private double doThings(List<ClassA> list){
ClassB[] array = list.toArray(new ClassB[0]);
// ...
}
这是一份汇编。为什么?
# 1 楼答案
爪哇。util。列出有趣的源代码:
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/List.java
根据类型,该类是泛型的:
但是,toArray方法由另一种类型参数化:
这是一个泛型方法,使用与类本身不同的类型作为参数。T和E之间没有联系。这就是为什么toArray方法中的参数可以使用不同的类型,而不是用于参数化列表的类
找到这种设计背后的原因会很有趣。乍一看,有点奇怪
# 2 楼答案
基于javadoc:
ArrayStoreException
-如果指定数组的运行时类型不是此列表中每个元素的运行时类型的超类型# 3 楼答案
无法声明该方法来防止
ArrayStoreException
的可能性。即使该方法被声明为具有参数类型A[]
,您仍然可以向其传递一个运行时类型为SubClassOfA[]
的数组,并且如果该列表具有A
对象,那么它将导致ArrayStoreException
,因为它们无法存储在SubClassOfA[]
中由于无法避免这种情况,而且这取决于程序员如何正确使用它,因此他们最好将该方法尽可能通用,并采用任何类型的数组。正确使用时(即当我们知道所有对象也是
B
的实例时),它不会导致ArrayStoreException