3

有以下类:

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

4

3 回答 3

6

香蕉水果。但是香蕉的清单不是水果的清单。否则,您可以列出香蕉并添加一个苹果(假设苹果水果)。

这听上去相当不切实际,但它是上面发生的事情的关键。您需要指定您的包装器,以便它采用扩展类型LivingBeing

有关更多信息,请参阅本文,尤其是“泛型不是协变的”部分。

于 2012-10-03T08:30:48.353 回答
3

您的validate方法声明必须使用带有LivingBeingWrapper参数的参数调用它LivingBeing。但是,您正在传递一个LivingBeingWrapper参数化的Human. 尝试从此更改您的方法声明:

public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)

对此:

public boolean validate(LivingBeingWrapper<? extends LivingBeing> livingBeingWrapper)
于 2012-10-03T08:31:31.153 回答
1

更改以下方法: -

public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)

public boolean validate(LivingBeingWrapper<T> livingBeingWrapper)

因为这个方法在你的类里面,就像: -

public class LivingBeingWrapper<T extends LivingBeing> 

因此,您可以在方法参数中使用类型 T,并且 T 将被替换为Horse.. 供您特别参考..

如果您的方法采用与 in不同的类型class definition (T),那么您可以使用此声明:-

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

现在,如果您必须调用validate(LivingBeingWrapper<Human>),您的方法必须定义为采用泛型类型参数 type Human,它 extends LivingBeing,这就是您的T类型(因为它还在您的类定义中扩展了 LivingBeing)

于 2012-10-03T08:31:26.060 回答