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>,因此,如果if是使用下界通配符定义的

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

最佳答案

问题不在于方法的返回类型,而在于绑定到类Generic TypeMixer

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

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


返回类型Mixer<? super Dog>表示,您可以返回任何类型MixerDog或Dog的super-type,可能是Animal

    //return new Mixer<Object>();//KO
    return new Mixer<Animal>(); //OK


因此,两个return语句都可以正常工作,因为AnimalObject都是super-typeDog

但是,first one不适合的原因是,您已将类声明为:-

public class Mixer<A extends Animal>


因此,您有bound您的type可以与Mixer类或其Animal关联的subtype类。
现在,由于Object不是Animal的子类型,所以不能只创建:-

new Mixer<Object>();


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

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

10-05 22:11