[英]Compile error with generics
有以下课程:
public class LivingBeing { … }
然后有
public class Human extends LivingBeing { … }
现在还有这个包装器:
public class LivingBeingWrapper<T extends LivingBeing> { … }
为了完成图片,还有方法
public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)
现在,当编写以下代码时
LivingBeingWrapper<Human> wrapper = createHumanWrapper();
validate(wrapper);
我收到以下编译错误:
MyType类型的方法validate(LivingBeingWrappe <LivingBeing> livingBeingWrapper)不适用于参数(LivingBeingWrapper <Human>)。
但为什么? Human
扩展了LivingBeing
。
香蕉是一种水果。 但是,香蕉清单并不是水果清单。 否则,您可以列出香蕉列表,然后添加一个苹果(假设苹果是水果)。
这听起来有点像组学,但这是上述情况的关键。 您需要指定包装器,使其采用扩展LivingBeing
类型。
有关更多信息,请参见本文 ,尤其是“泛型不是协变”部分。
您的validate
方法声明必须使用通过LivingBeingWrapper
参数化的LivingBeingWrapper
进行LivingBeing
。 但是,您传入的是使用Human
参数化的LivingBeingWrapper
。 尝试从此更改方法声明:
public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)
对此:
public boolean validate(LivingBeingWrapper<? extends LivingBeing> livingBeingWrapper)
更改以下方法:-
public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)
至
public boolean validate(LivingBeingWrapper<T> livingBeingWrapper)
由于此方法在您的类内部,因此:-
public class LivingBeingWrapper<T extends LivingBeing>
因此,您可以在方法参数中使用类型T,并且T将被Horse
..代替,以供您参考。
并且,如果您的方法采用的类型不同于class definition (T)
,则可以使用以下声明:-
public boolean validate(LivingBeingWrapper<? extends LivingBeing>
livingBeingWrapper)
现在,如果必须调用validate(LivingBeingWrapper<Human>)
,则必须将您的方法定义为采用通用类型参数类型Human
,这将扩展LivingBeing
,这就是您的T
类型(因为它也在您的类定义中扩展了LivingBeing) )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.