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