gpt4 book ai didi

java - 如何分配 List 扩展到 List

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

class BaseClass implements IData ();
class ChildClassA() extends BaseClass;
class ChildClassB() extends BaseClass;

因为不能做

List<BaseClass> aList = new ArrayList<ChildClassA>()

所以有一个

List<? extends IData> aList 
for pointint to either
ArrayList<ChildClassA>(),
or
ArrayList<ChildClassB>()

aList是由其他路由在运行时构建的,那部分代码有一个函数可以接受 List<IData>来自aList

问题是如果 List<? extends IData> aList指向ArrayList<ChildClassA>()ArrayList<ChildClassB>() ,

它能做到吗ListData<IData> outputList = (List<IData>) aList ?如下所示:

(似乎它正在工作,但不确定是否有比转换更好的方法来分配泛型数组。)

编辑 List<IData> outputList 的输出仅供只读使用(不可变),不能插入/删除,它只会迭代 IData 以对 IData 的真实情况使用react。

List<? extends IData> aList =  new ArrayList<ChildClassA>();
ListData<IData> outputList = (List<IData>)aList

List<? extends IData> aList = new ArrayList<ChildClassB>();
ListData<IData> outputList = (List<IData>)aList

最佳答案

tl;dr 使用 Collections#unmodifiableList :

List<IData> outputList = Collections.unmodifiableList(aList);

有关此主题的更多信息,您可能希望熟悉 PECS原则。


这是不可能的,因为这两种类型是不兼容的。

A List<BaseClass>正是它所声明的,BaseClass 的列表对象。更准确地说,它做出了两个保证:

  • 从中检索到的对象可分配给BaseClass
  • 可分配给 BaseClass 的每个对象可以添加到它(而不是其他)

A List<? extends BaseClass>是一个更宽松的声明。准确的说,它根本就没有做二次保证。然而,不仅保证没有了,而且现在不可能向它添加项目,因为列表的确切泛型类型是未定义的。它甚至可能在运行时针对相同的列表声明(不是相同的列表对象)而改变。

因此,一个 List<? extends BaseClass>不可分配给 List<BaseClass> ,因为后者做出了前者无法实现的保证。


实际上,考虑以下方法:

public List<BaseClass> makeList() {
// TODO implement method
return null;
}

如果有人实现了这个方法,返回一个List<? extends BaseClass> ,使用此方法的客户端将无法向其添加项目,尽管其声明另有说明。

因此,这样的分配会导致编译错误。

要解决示例问题,可以将松散声明添加到方法中:

public List<? extends BaseClass> makeList() {
// TODO implement method
return null;
}

这将向每个客户端发出信号,从该方法返回的列表并不意味着要向其中添加项目。


现在让我们回到您的用例。在我看来,最合适的解决方法是改写函数

take[s] a List from the the aList.

目前看来它被声明为

public void useList(List<BaseClass> list);

但由于它不向列表中添加项目,因此应声明为

public void useList(List<? extends BaseClass> list);

但是,如果该方法是当前不可更改的 API 的一部分,您仍然可以:

List<? extends BaseClass> list;
....
List<BaseClass> tmp = Collections.unmodifiableList(list);
useList(tmp);

关于java - 如何分配 List<?将 BaseClass> 扩展到 List<BaseClass>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50495989/

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