【发布时间】:2011-06-24 23:38:57
【问题描述】:
好的,这是我的问题:
我有一个包含接口的列表 - List<Interface> a - 以及扩展该接口的接口列表:List<SubInterface> b。我想设置a = b。我不希望使用addAll() 或任何会消耗更多内存的东西,因为我正在做的事情已经非常耗费成本。我真的需要能够说a = b。我试过List<? extends Interface> a,但是我无法将接口添加到列表a,只能添加子接口。有什么建议吗?
我希望能够做这样的事情:
List<SubRecord> records = new ArrayList<SubRecord>();
//add things to records
recordKeeper.myList = records;
RecordKeeper 类包含接口列表(不是子接口)
public class RecordKeeper{
public List<Record> myList;
}
【问题讨论】:
-
如果不修改列表的定义,就没有干净的方法可以做到这一点。想象一下你做到了,那么这是对的,但不是:
class Record2 extends Record { ... }; recordKeeper.myList = records; recordKeeper.myList.add(new Record2());你知道为什么错了吗? -
如果你使用'? extends Record' 那么你的意思是你不知道列表的确切类型,所以你必须使用类型转换(在列表上)来添加元素。 Java 会知道列表中的每个元素都扩展了 Record,因此您可以从中获取 Record 对象,但您不能插入任何 Record,因为 List 是使用 Java 不知道的类型键入的。你想参加聚会,但门卫把客人名单弄丢了。
-
所以,八年后,我回顾这个问题,意识到 Java 编译器(曾经?有一段时间没用过 Java)只是愚蠢,并且不擅长 LSP。
标签: java generics parameters