假设我有 MyEdge
和 MyEdgeModified
,这样 MyEdge
是父类(super class),MyEdgeModified
是子类。现在,假设我这样做:
List<List<MyEdge>> collectionOfEdgeLists = new LinkedList<List<MyEdge>>();
for(int i = 0; i < someValue; i++) {
List<MyEdgeModified> newList = someMethod();
collectionOfEdgeLists.add(newList); //ruh roh
}
现在,如果我这样做:
private List<MyEdge> convert(final List<MyEdgeModified> list) {
final List<MyEdge> otherList = new ArrayList<MyEdge>(list.size());
for(Edge edge : list) {
otherList.add(edge);
}
return otherList;
}
然后:
collectionOfEdgeLists.add(convert(newList)); //ok...
现在,我在这里看到的问题是,我可以将每个单独的 MyEdgeModified
视为 Edge
,但如果我有一个集合,我必须首先构建一个整个“另一个列表”才能使用它。为什么?难道我做错了什么?这对我来说似乎是错误和愚蠢的。
最佳答案
考虑这段代码:
List<MyEdgeModified> modifiedList = new List<MyEdgeModified>();
// This is what you want to do, but which doesn't work
List<MyEdge> edgeList = modifiedList;
// Now this would have to be valid...
edgeList.add(new MyEdge());
// And this should be valid too...
MyEdgeModified modified = modifiedList.get(0);
...但是您已成功引用 MyEdge
的实例进入List<MyEdgeModified>
- 所以你已经成功地破坏了类型安全。
这就是规则要防止的事情。
现在您可以做的是使用通配符:
List<MyEdgeModified> modifiedList = new List<MyEdgeModified>();
List<? extends MyEdge> edgeList = modifiedList;
届时,您将无法添加到 edgeList
,但你可以从中拿走元素……所以一切都是安全的。
现在创建一个 List<List<? extends MyEdge>>
结果又变得更棘手了...我不记得是否允许这样做...
一般来说,查找这类事情的详细信息的最佳位置是 Angelika Langer's Java Generics FAQ .
关于Java:使用父类(super class)操作列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463511/