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

Joe*_*Joe 2 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Roh*_*ain 6

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

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

public <C extends Cat> Mixer<? super Dog> useMe(A a, C c)
Run Code Online (Sandbox Code Playgroud)

返回类型的Mixer<? super Dog>意思是,你可以返回任何Mixer类型的狗Dog或者super-typeAnimal.

    //return new Mixer<Object>();//KO
    return new Mixer<Animal>(); //OK
Run Code Online (Sandbox Code Playgroud)

所以,无论是returnstatments 会工作得很好,因为,无论是AnimalObjectsuper-typeDog.

但是,之所以first one不适合的原因是因为,你宣布你的班级为: -

public class Mixer<A extends Animal>
Run Code Online (Sandbox Code Playgroud)

所以,你有bound你的type那个可以与Mixer任何一个Animal或它的类相关联subtype.现在,因为,Object不是一个子类型Animal,你不能只创建: -

new Mixer<Object>();
Run Code Online (Sandbox Code Playgroud)

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

new Mixer<Animal>(); // OR
new Mixer<Dog>();  // Dog extends Animal  // OR
new Mixer<Cat>();  // Cat extends Animal

// **** But NOT like this ******
new Mixer<Object>();  // Object does not extend Animal
Run Code Online (Sandbox Code Playgroud)