gpt4 book ai didi

Java 使用带有列表和接口(interface)的泛型

转载 作者:搜寻专家 更新时间:2023-10-31 19:30:47 24 4
gpt4 key购买 nike

好的,这是我的问题:

我有一个包含接口(interface)的列表 - List<Interface> a - 以及扩展该接口(interface)的接口(interface)列表:List<SubInterface> b .我想设置 a = b .我不想使用 addAll()或任何会消耗更多内存的东西,因为我正在做的事情已经非常耗费成本。我确实需要能够说 a = b .我试过List<? extends Interface> a ,但我无法将接口(interface)添加到列表 a ,只有子接口(interface)。有什么建议吗?

我希望能够做这样的事情:

List<SubRecord> records = new ArrayList<SubRecord>();
//add things to records
recordKeeper.myList = records;

RecordKeeper 类是包含接口(interface)列表(不是子接口(interface))的类

public class RecordKeeper{
public List<Record> myList;
}

最佳答案

这有效:

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

}

}

我的意思是它可以编译,但是你必须转换你的 List<? extends Record>在里面添加任何东西之前。如果要转换的类型是 Record 的子类,Java 将允许转换, 但它无法猜测它将是哪种类型,您必须指定它。

A List<Record>只能包含 Records (包括 subRecords ),一个 List<SubRecord>只能包含 SubRecords .

但是一个List<SubRecord > 不是 List<Record>有它不能包含 Records ,并且子类应该总是做父类(super class)可以做的事情。这很重要因为继承是专门化的,如果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() );

正如我们刚刚看到的,这只适用于 List<Record>。不适用于任何 List<Something that extends Record>例如 List<SubRecord> .

问候, 斯蒂芬

关于Java 使用带有列表和接口(interface)的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6474784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com