Java 泛型编译错误

Java 泛型编译错误,java,generics,inheritance,compiler-errors,extends,Java,Generics,Inheritance,Compiler Errors,Extends,下面是一节课: public class LivingBeing { … } 然后是 public class Human extends LivingBeing { … } 现在还有这个包装器: public class LivingBeingWrapper<T extends LivingBeing> { … } 公共类LivingBeingWrapper{…} 要完成这幅图,还有一个方法 public boolean validate(LivingBeingWrappe

下面是一节课:

public class LivingBeing { … }
然后是

public class Human extends LivingBeing { … }
现在还有这个包装器:

public class LivingBeingWrapper<T extends LivingBeing> { … }
公共类LivingBeingWrapper{…}
要完成这幅图,还有一个方法

public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)
公共布尔验证(LivingBeingWrapper LivingBeingWrapper)
现在在编写以下代码时

LivingBeingWrapper<Human> wrapper = createHumanWrapper();
validate(wrapper);
LivingBeingWrapper=createHumanWrapper();
验证(包装);
我得到以下编译错误:

方法验证(LivingBeingWrappe) MyType类型中的livingBeingWrapper)不适用于 参数(LivingBeingWrapper)


但是为什么呢<代码>人类扩展了
生物

香蕉是一种水果。但是香蕉清单不是水果清单。否则,你可以拿一份香蕉清单,加上一个苹果(假设苹果是一种水果)

这听起来有点像侏儒,但这是上面发生的事情的关键。您需要指定包装器,以便它采用扩展
livingbeeing
的类型


有关更多信息,请参阅,特别是“泛型不协变”部分。

更改以下方法:-

public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)

现在,如果您必须调用
validate(LivingBeingWrapper)
,那么您的方法必须被定义为采用泛型类型参数type
Human
,它扩展了
livingbeeng
,这就是您的
T
类型(因为它也扩展了类定义中的livingbeeng)

您的
validate
方法声明必须使用
LivingBeingWrapper
参数化的
LivingBeing
调用它。但是,您正在传入一个
LivingBeingWrapper
,该包装使用
Human
参数化。尝试从以下位置更改方法声明:

public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)
公共布尔验证(LivingBeingWrapper LivingBeingWrapper)
为此:

public boolean validate(LivingBeingWrapper<? extends LivingBeing> livingBeingWrapper)

public boolean validate(LivingBeingWrapper
只意味着LivingBeing,
我认为您正在遭受类型擦除的痛苦…但是,+1对于一个结构良好的问题,您可以尝试:
public boolean validate吗(LivingBeingWrapper我喜欢这个解释。如果你也添加了具体的建议,我会删除我的答案。
validate
不是
LivingBeingWrapper
上的一个方法。你使用的是
t
。但是
validate
不一定是参数化类上的一个方法。@DavidGrant..是的,我假设它在那个类中..所以,我已经提到了..编辑了文章以添加该部分。。
public boolean validate(LivingBeingWrapper<? extends LivingBeing> 
                                                    livingBeingWrapper)
public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)
public boolean validate(LivingBeingWrapper<? extends LivingBeing> livingBeingWrapper)