Java:使用父类(super class)操作列表

标签 java inheritance collections

假设我有 MyEdgeMyEdgeModified,这样 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/

相关文章:

.net - U[] 是如何转换为 T[] 的?

java - Map.clear() 与新 map : Which one will be better?

kotlin - 是否可以在 Kotlin 的集合过滤中使用功能接口(interface)?

java - 在 Visual Studio Code 中禁用带有类名的注释

java - JFileChooser 产生错误

java - 继承 :hidden variable of superclass in subclass

c# - C#中如何模拟多重继承

Java 列表排序 : Is there a way to keep a list permantly sorted automatically like TreeMap?

java - Spring Controller - 线程安全和存储资源

java - Android Studio,应用程序将无法运行而不崩溃