我正在尝试创建一个T类型的列表,其中T实现了2个接口。要添加到此列表中,我必须进行演员表,但我觉得我不应该这样做。有更优雅的方式吗?
(generalLabLookup
返回List<Lab>
,generalVisitLookup
返回List<Visit>
。Lab
和Visit
都会实现HasId&amp; HasDate,而不是有一个非Object的超类。查找方法和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
}
答案 0 :(得分:6)
关于Lab
和Visit
的信息不足,但我会假设这些是不相关的具体类型,除了它们都实现{{1} }和HasId
:
HasDate
鉴于此,您似乎正在尝试创建可包含class Lab implements HasId, HasDate { ... }
class Visit implements HasId, HasDate { ... }
和Lab
对象的异构列表。但除了Visit
之外,您无法使用具体类型执行此操作,因为对于任何具体类型Object
,Concrete
不能同时包含List<Concrete>
{1}}和Lab
个对象。基于此,我认为使用参数Visit
使此方法具有通用性是错误的,因为类型<T extends HasId & HasDate>
不起作用。
您可能想要做的是为某些接口类型创建T
。当您想要一个异构列表时,这是正常的做事方式,其中所有对象都应该实现List<InterfaceType>
,但不需要有任何共同点。您的问题是您有两种接口类型,并且您希望列表中的对象同时实现这两种类型。
解决方案是定义一个新接口,而不是使其成为通用接口:
InterfaceType
并使interface HasIdAndDate extends HasId, HasDate {
}
成为labsAndVisits
而不是List<HasIdAndDate>
。 (如果List<T>
和HasId
定义具有相同名称和相同参数类型的方法,则可能会遇到问题,在这种情况下,最佳解决方案可能是更改其中一个方法名称。)
注意:我没有测试过这个。