具有较低有界通配符的通用<! - ?超级狗 - >

时间:2012-10-15 09:43:54

标签: java generics wildcard bounded-wildcard

class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
public class Mixer<A extends Animal>{
    public <C extends Cat> Mixer<? super Dog> useMe(A a, C c){
        //return new Mixer<Object>();//KO
        return new Mixer<Animal>(); //OK
    }
}

返回参数为Mixer<? super Dog>,因此如果使用较低的有界通配符

进行定义

当我返回Mixer<Object>并且Mixer<Animal>没有编译器错误时,为什么会出现编译器错误?

1 个答案:

答案 0 :(得分:6)

问题不在于您的方法的返回类型,而是Generic Type绑定到您的类Mixer

让我们看看出了什么问题: -

public <C extends Cat> Mixer<? super Dog> useMe(A a, C c)

返回类型 Mixer<? super Dog> 表示您可以返回Mixer类型的Dogsuper-type的狗,可能是{{ 1}}。

Animal

因此, //return new Mixer<Object>();//KO return new Mixer<Animal>(); //OK 个数据都可以正常运行,因为returnAnimal都是Object super-type }}

但是 Dog不适合的原因是因为,您已将您的课程声明为: -

first one

因此,您public class Mixer<A extends Animal> bound可以与type课程相关联Mixer或其Animal。 现在,由于subtype不是Object的子类型,因此您无法创建: -

Animal

因此,您可以创建类的实例,如: -

new Mixer<Object>();