Java 继承多个接口的泛型

Java 继承多个接口的泛型,java,generics,casting,Java,Generics,Casting,我试图创建一个类型T的列表,其中T实现了两个接口。要添加到这个列表中,我必须做一个演员,但我觉得我不应该这样做。有没有更优雅的方法 (generallalblookup返回一个列表,generalVisitLookup返回一个列表。Lab和Visit都实现了HasId和HasDate,并且都没有对象以外的超类。两种查找方法和codeCheckDao都不是泛型的。) void Laband VisitAction(内部测量){ LocalDate startDate=LocalDate.of(me

我试图创建一个类型T的列表,其中T实现了两个接口。要添加到这个列表中,我必须做一个演员,但我觉得我不应该这样做。有没有更优雅的方法

generallalblookup
返回一个
列表
generalVisitLookup
返回一个
列表
Lab
Visit
都实现了HasId和HasDate,并且都没有对象以外的超类。两种查找方法和codeCheckDao都不是泛型的。)

void Laband VisitAction(内部测量){
LocalDate startDate=LocalDate.of(measureyar,1,1);
LocalDate endDate=LocalDate.of(measureyar,12,31);
List LabsandVisitions=新建ArrayList();
addAll((列表)codeCheckDao.generallalblookup(开始日期、结束日期、不包括支持日期));
addAll((列表)codeCheckDao.generalVisitLookup(开始日期、结束日期、不包括支持日期));
//做其他事情
}

关于
Lab
Visit
的信息不足,但我假设这些是不相关的具体类型,除了它们都实现了
HasId
HasDate

class Lab implements HasId, HasDate { ... }
class Visit implements HasId, HasDate { ... }
有鉴于此,您似乎正在尝试创建一个异构列表,该列表可以包含
Lab
Visit
对象。但是除了
对象
,您不能对具体类型执行此操作,因为对于任何具体类型
具体
列表
不能同时包含
实验室
访问
对象。基于此,我认为使用参数
使此方法泛型是错误的,因为没有类类型
T

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

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

interface HasIdAndDate extends HasId, HasDate {
}
并将
标签和访问
设置为
列表
,而不是
列表
。(如果
HasId
HasDate
定义具有相同名称和相同参数类型的方法,则可能会遇到问题,在这种情况下,最好的解决方案可能是更改其中一个方法名称。)


注意:我还没有测试过这一点。

关于
Lab
Visit
的信息还不够,但是我假设这些是不相关的具体类型,除了它们都实现了
HasId
HasDate

class Lab implements HasId, HasDate { ... }
class Visit implements HasId, HasDate { ... }
有鉴于此,您似乎正在尝试创建一个异构列表,该列表可以包含
Lab
Visit
对象。但是除了
对象
,您不能对具体类型执行此操作,因为对于任何具体类型
具体
列表
不能同时包含
实验室
访问
对象。基于此,我认为使用参数
使此方法泛型是错误的,因为没有类类型
T

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

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

interface HasIdAndDate extends HasId, HasDate {
}
并将
标签和访问
设置为
列表
,而不是
列表
。(如果
HasId
HasDate
定义具有相同名称和相同参数类型的方法,则可能会遇到问题,在这种情况下,最好的解决方案可能是更改其中一个方法名称。)


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

没有看到
generallalblookup
generalVisitLookup
的定义,我看不到回答这个问题的方法。我告诉大家commentsHow中的返回类型是
Lab
Visit
定义的?除此之外,它们都实现了这两个接口,它们本身就是接口吗?它们是抽象的吗?
Lab
Visit
中的一个是否扩展了另一个?它们都扩展了一些公共类吗?这不是问题,而是方法的签名是什么样子的。如果它的返回类型仅声明为List,编译器不知道它实际上是List和complaints,比如说
labAndVisitAction
方法接受
List
作为参数。你从那里经过了
列表
。编译器是否应该自动允许您调用
list.addAll(codeCheckDao.generalVisitLookup(startDate、endDate、excludeSupp))
?编译器无法假定运行时
t
将是什么。它可以是满足
扩展HasId和HasDate
条件的任何类型。如果没有看到
generallalblookup
generalVisitLookup
的定义,我看不到回答这个问题的方法。我告诉大家,commentsHow中的返回类型是
Lab
Visit
定义的?除此之外,它们都实现了这两个接口,它们本身就是接口吗?它们是抽象的吗?
Lab
Visit
中的一个是否扩展了另一个?它们都扩展了一些公共类吗?这不是问题,而是方法的签名是什么样子的。如果它的返回类型仅声明为List,编译器不知道它实际上是List和complaints,比如说
labAndVisitAction
方法接受
List
作为参数。你从那里经过了
列表
。编译器应该自动运行吗