gpt4 book ai didi

java - 如何为 List 返回 List

转载 作者:行者123 更新时间:2023-11-29 06:49:26 24 4
gpt4 key购买 nike

以下代码非常无用且未经测试。它应该只解释问题。我想对应用程序隐藏实现类,但要定义层次结构。

给定以下接口(interface)

public interface RowType {
Integer getSumFromHere();
}

public interface TableType {
List<RowType> getRows();
}

实现者

public class RowImpl implements RowType {

private Integer value = 0;
private RowImpl nextRow;

public RowImpl someFunctionNotInInterface() {
return nextRow;
}

@Override
public Integer getSumFromHere() {
return nextRow == null ? value : value + nextRow.getSumFromHere();
}
}

public class TableImpl implements TableType {

List<RowImpl> implList = new ArrayList<>();

public void doSomethingOnImpl (){
for(RowImpl row : implList) {
row.someFunctionNotInInterface();
}
}

@Override
public List<RowType> getRows() {
return implList;
}
}

getRows() 的实现导致错误 "cannot convert from List<RowImpl> to List<RowType>"事实上,它保证了 implList 中的每个条目都可以通过接口(interface) RowType 访问,因此它可以工作。

我试过了 <? extends RowType>但这与 TableType 接口(interface)不兼容。当然,我可以通过复制列表 return new ArrayList<>(implList); 来简单地解决问题。但这与引用类持有的列表不同。

是否有解决方案,还是设计完全错误?

编辑:在 TableImpl 中添加了功能,阐明了为什么列表是基于 RowImpl 而不是基于 RowType 构建的。

最佳答案

implListList<RowImpl>并且应该只包含 RowImpl实例。

List<RowType>你返回的是一个add(RowType)方法,例如,可用于添加 RowType 不是的实例RowImpl .

因此,List<RowType> 不是 List<RowImpl> 的父类(super class)型你将不得不投implList如果您想返回。

同时,你要确保它没有被调用者修改,以至于它真的只能包含RowImpl。实例。

Collections.unmodifiableList() 方法完成了这两项工作:

@Override
public List<RowType> getRows() {
return Collections.unmodifiableList(implList);
}

关于java - 如何为 List<interface> 返回 List<Impl>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53851597/

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