所以对于初学者来说我有一个LinkedList<String>,
我可以轻松地将它转换为数组通过toArray().即
LinkedList<String> strList = new LinkedList<String>();
String[] strArray = strList.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)
但是让我说我有一个LinkedList<T>
然后我以下代码:
LinkedList<T> tList = new LinkedList<T>();
T[] strArray = tList.toArray(new T[0]);
Run Code Online (Sandbox Code Playgroud)
我得到了无法创建T错误消息的通用数组.
我怎么能绕过这个?
特别是在我的课程中LinkedList<AbstractNode<T>> nodes,我正在尝试实现一个getAll()方法,该方法将所有节点作为Array返回.
谢谢!
注意 PéterTörök的答案为我的问题提供了正确的答案,但对于我来说,简单地返回一个ArrayList而不是像Bar所提到的那样,最终平滑了我的代码.
注意2看了我的代码之后我甚至不确定是否需要进行任何转换,LinkedList对于我试图做的事情很好......: - /
Pét*_*rök 13
在类库中使用的解决方法是(使用未经检查的强制转换)
public <T> T[] toArray(List<T> list, T[] a) {
if (a.length < list.size()) {
a = (T[])java.lang.reflect.Array.newInstance(
a.getClass().getComponentType(), list.size()));
}
return list.toArray(a);
}
Run Code Online (Sandbox Code Playgroud)
或者,使用Class参数而不是数组:
public <T> T[] toArray(List<T> list, Class<T> k) {
return list.toArray(
(T[])java.lang.reflect.Array.newInstance(k, list.size()));
}
Run Code Online (Sandbox Code Playgroud)
来自Java Generics and Collections,第6.4-5章.
无法创建通用数组是Java中最严重的限制之一.因为它太烦人了,所以值得重申它发生的原因:通用数组是有问题的,因为泛型是通过擦除来实现的,但是擦除是有益的,因为它可以简化进化.
最好的解决方法是使用
ArrayListCollections Framework中的一些其他类而不是数组.我们在2.5节讨论了集合类和数组之间的权衡,我们注意到在许多情况下集合比数组更可取:因为它们在编译时捕获更多错误,因为它们提供了更多操作,并且因为它们在表示方面提供了更大的灵活性.到目前为止,数组提供的问题的最佳解决方案是"只说不":使用集合优先于数组.有时这不起作用,因为出于兼容性或效率的原因需要一个数组.这种情况的例子发生在Collections Framework中:为了兼容性,方法toArray将一个集合转换为一个数组[...]
[...]将一个集合转换为一个数组的天真方法是行不通的.我们可能尝试的第一个修复是添加一个未经检查的强制转换,但我们很快就会看到这会导致更复杂的问题.正确的解决方案需要我们求助于反思.
| 归档时间: |
|
| 查看次数: |
6486 次 |
| 最近记录: |