java - 使用泛型编译错误

标签 java generics inheritance compiler-errors extends

有以下类:

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);

我得到以下编译错误:

The method validate(LivingBeingWrappe<LivingBeing> livingBeingWrapper) in the type MyType is not applicable for the arguments (LivingBeingWrapper<Human>).

但是为什么? Human 扩展了 LivingBeing

最佳答案

香蕉是一种水果。但是香蕉列表不是水果列表。否则,您可以获取香蕉列表并添加一个苹果(假定苹果是一种水果)。

这听起来很玄乎,但它是上面发生的事情的关键。您需要指定包装器,使其采用扩展 LivingBeing 的类型。

有关详细信息,请参阅 this article ,尤其是“泛型不是协变的”部分。

关于java - 使用泛型编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12704583/

相关文章:

java - 由 : java. lang.ClassNotFoundException : org. slf4j.LoggerFactory 引起

Java ArrayList<Double> 作为参数

c# - 作为协变类型参数,类和结构之间存在差异

c++ - C++接口(interface)多重继承中的歧义

inheritance - shared_ptr 返回一个接口(interface)

c# - 泛型继承 c#

java - Openshift 部署 F8 : Cannot access cluster for detecting mode: sun. security.validator.ValidatorException

java - 页面在浏览器而不是 Webview 上打开

java - Spring AOP - 使用连接点获取泛型类类型(JAVA)

java - lambda 表达式中的错误返回类型无法将 Object 转换为 T