我正在尝试创建类型T的列表,其中T实现2个接口。要添加到此列表中,我必须进行转换,但是我觉得我不必这样做。有没有更优雅的方式做到这一点?
(generalLabLookup
返回一个List<Lab>
,generalVisitLookup
返回一个List<Visit>
。Lab
和Visit
都实现HasId和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
}
最佳答案
关于Lab
和Visit
的信息不足,但是我将假定它们是不相关的具体类型,但它们都实现了HasId
和HasDate
:
class Lab implements HasId, HasDate { ... }
class Visit implements HasId, HasDate { ... }
鉴于此,您似乎正在尝试创建一个可以同时包含
Lab
和Visit
对象的异构列表。但是您不能使用Object
以外的具体类型执行此操作,因为对于任何具体类型Concrete
,List<Concrete>
不能同时包含Lab
和Visit
对象。基于此,我认为使此方法与参数<T extends HasId & HasDate>
通用是错误的,因为没有任何类类型T
将起作用。您可能想要做的是为某些接口类型创建一个
List<InterfaceType>
。当您需要一个异构列表(所有对象均应实现InterfaceType
,但不需要其他任何共同点)时,这是正常的处理方式。您的问题是您有两种接口类型,并且希望列表中的对象同时实现这两种。解决方案是定义一个新接口,而不是使其通用:
interface HasIdAndDate extends HasId, HasDate {
}
并将
labsAndVisits
设置为List<HasIdAndDate>
而不是List<T>
。 (如果HasId
和HasDate
定义具有相同名称和相同参数类型的方法,则可能会遇到问题,在这种情况下,最佳解决方案可能是更改方法名称之一。)注意:我尚未对此进行测试。
关于java - 泛型继承多个接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46028407/