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

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

最佳答案

关于LabVisit的信息不足,但是我将假定它们是不相关的具体类型,但它们都实现了HasIdHasDate

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


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

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

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

interface HasIdAndDate extends HasId, HasDate {
}


并将labsAndVisits设置为List<HasIdAndDate>而不是List<T>。 (如果HasIdHasDate定义具有相同名称和相同参数类型的方法,则可能会遇到问题,在这种情况下,最佳解决方案可能是更改方法名称之一。)

注意:我尚未对此进行测试。

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

10-12 22:56