繁体   English   中英

泛型编译错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM