泛型继承多个接口

时间:2017-09-03 22:39:01

标签: java generics casting

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

generalLabLookup返回List<Lab>generalVisitLookup返回List<Visit>LabVisit都会实现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
}

1 个答案:

答案 0 :(得分:6)

关于LabVisit的信息不足,但我会假设这些是不相关的具体类型,除了它们都实现{{1} }和HasId

HasDate

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

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

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

InterfaceType

并使interface HasIdAndDate extends HasId, HasDate { } 成为labsAndVisits而不是List<HasIdAndDate>。 (如果List<T>HasId定义具有相同名称和相同参数类型的方法,则可能会遇到问题,在这种情况下,最佳解决方案可能是更改其中一个方法名称。)

注意:我没有测试过这个。