gpt4 book ai didi

java - 泛型继承多个接口(interface)

转载 作者:行者123 更新时间:2023-11-29 06:51:44 31 4
gpt4 key购买 nike

我正在尝试创建类型 T 的列表,其中 T 实现 2 个接口(interface)。要添加到此列表,我必须进行类型转换,但我觉得我不应该这样做。有更优雅的方法吗?

( generalLabLookup 返回一个 List<Lab>generalVisitLookup 返回一个 List<Visit>LabVisit 都实现了 HasId 和 HasDate,并且除了 Object 之外都没有父类(super class)。这两种查找方法都不是, codeCheckDao 也不是通用的。)

<T extends HasId & HasDate> void labAndVisitAction(int measureYear) {
LocalDate startDate = LocalDate.of(measureYear, 1, 1);
LocalDate endDate = LocalDate.of(measureYear, 12, 31);
List<T> labsAndVisits = new ArrayList<T>();

labsAndVisits.addAll( (List<T>) codeCheckDao.generalLabLookup(startDate, endDate, excludeSupp));
labsAndVisits.addAll((List<T>)codeCheckDao.generalVisitLookup(startDate, endDate, excludeSupp));

//do other stuff
}

最佳答案

关于 Lab 的信息不足和 Visit , 但我假设这些是不相关的具体类型,除了它们都实现了 HasIdHasDate :

class Lab implements HasId, HasDate { ... }
class Visit implements HasId, HasDate { ... }

鉴于此,您似乎正在尝试创建一个可以同时包含 Lab 的异构列表。和 Visit对象。但是除了 Object 之外,您不能使用具体类型来执行此操作,因为对于任何具体类型 Concrete , 一个 List<Concrete> 不能同时包含 LabVisit对象。基于此,我认为使用参数 <T extends HasId & HasDate> 使此方法通用是错误的, 因为没有类类型 T将工作。

您可能想要做的是创建一个 List<InterfaceType>对于某些接口(interface)类型。当您想要一个异构列表时,这是正常的做事方式,其中所有对象都应实现 InterfaceType ,但不需要有任何其他共同点。您的问题是您有两种接口(interface)类型,并且您希望列表中的对象同时实现这两种类型。

解决方案是定义一个新接口(interface),而不是使其通用:

interface HasIdAndDate extends HasId, HasDate {
}

并制作labsAndVisits一个List<HasIdAndDate>而不是 List<T> . (如果 HasIdHasDate 定义具有相同名称和相同参数类型的方法,您可能会遇到问题,在这种情况下,最好的解决方案可能是更改其中一个方法名称。)

注意:我没有对此进行测试。

关于java - 泛型继承多个接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46028407/

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