Mir*_*ate 5 java generics parameters
好的,所以这是我的问题:
我有一个包含接口的列表List<Interface> a- 以及扩展该接口的接口列表:List<SubInterface> b.我想设置a = b.我不想使用addAll()或任何会花费更多内存的东西,因为我正在做的事情已经非常耗费成本.我真的需要能够说出来a = b.我试过List<? extends Interface> a,但后来我不能将接口添加到列表中a,只能添加SubInterfaces.有什么建议?
编辑
我希望能够做到这样的事情:
List<SubRecord> records = new ArrayList<SubRecord>();
//add things to records
recordKeeper.myList = records;
Run Code Online (Sandbox Code Playgroud)
RecordKeeper类是包含接口列表(NOT子接口)的类
public class RecordKeeper{
public List<Record> myList;
}
Run Code Online (Sandbox Code Playgroud)
另一个编辑:
我发布了我的工作解决方案.我感谢所有回答的人,并为显然让我的问题如此混乱而道歉.
这有效:
public class TestList {
interface Record {}
interface SubRecord extends Record {}
public static void main(String[] args) {
List<? extends Record> l = new ArrayList<Record>();
List<SubRecord> l2 = new ArrayList<SubRecord>();
Record i = new Record(){};
SubRecord j = new SubRecord(){};
l = l2;
Record a = l.get( 0 );
((List<Record>)l).add( i ); //<--will fail at run time,see below
((List<SubRecord>)l).add( j ); //<--will be ok at run time
}
}
Run Code Online (Sandbox Code Playgroud)
我的意思是它编译,但是你将不得不投你List<? extends Record>里面添加任何东西之前.如果要转换为的类型是Java的子类,Java将允许转换Record,但它无法猜测它将是哪种类型,您必须精确它.
A List<Record>只能包含Records(包括subRecords),A List<SubRecord>只能包含SubRecords.
但是A List<SubRecord>不是List<Record>它不能包含的Records,并且子类应该总是做超类可以做的事情.这很重要,因为继承是specilisation,如果它List<SubRecords>是一个子类List<Record>,它应该能够包含`但它不是.
A List<Record>和List<SubRecord>两者都是List<? extends Record>.但在一个List<? extends Record>你不能添加任何东西,因为java无法知道哪个类型List是一个容器.想象一下你可以,然后你可以有以下声明:
List<? extends Record> l = l2;
l.add( new Record() );
Run Code Online (Sandbox Code Playgroud)
正如我们刚刚看到的那样,这只适用List<Record>于任何List<Something that extends Record>此类情况List<SubRecord>.
此致,Stéphane
所以,我的一个朋友找到的相当简单的解决方案是:
recordKeeper.myList = (List<Record>)(List<? extends Record>)records;
Run Code Online (Sandbox Code Playgroud)
据我了解,这是有效的,因为它需要一小步。List<SubRecord>是一个List<? extends Record>,并且List<? extends Record>是一个List<Record>。它可能不漂亮,但仍然有效。