【发布时间】:2016-08-04 13:55:41
【问题描述】:
假设你有一个如下定义的数组列表:
ArrayList<String> someData = new ArrayList<>();
稍后在您的代码中,由于泛型,您可以这样说:
String someLine = someData.get(0);
并且编译器完全知道它将得到一个字符串。耶泛型!但是,这将失败:
String[] arrayOfData = someData.toArray();
toArray() 将始终返回一个对象数组,而不是定义的泛型。为什么get(x)方法知道返回的是什么,而toArray()默认是Objects?
【问题讨论】:
-
你在说什么?哪个类有
toArray()方法? -
ArrayList 有一个
toArray()方法,但是即使定义了泛型,toArray()方法也会返回Object[],而不是E[],这是使用泛型隐含的。 -
您可以使用
toArray(T[] a)方法来获取适当的数组,而不是覆盖toArray()。 -
是的,我知道我可以到
toArray(T[] a),但为什么它不直接内置在toArray()中。我不明白为什么get(x)知道它发出了什么,而toArray()却不知道。 -
@JimmyB:另一种选择是动态类型的某种工厂,例如Java 8’s
Stream.toArray使用IntFunction<ArrayType>作为工厂类型,作为参数传递。这种模式以前没有使用过的原因,例如对于Collection接口,只有Java 8 允许像ElementType[]::new一样简洁地实现它,例如String[] array = stream.toArray(String[]::new)…