2
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>如果用下界通配符定义,则返回参数如此

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

4

1 回答 1

6

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

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

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

返回类型Mixer<? super Dog>意味着,您可以返回任何Mixer类型Dogsuper-typeDog,可能是Animal.

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

因此,这两个return陈述都可以正常工作,因为AnimalObject都是super-typeDog

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

public class Mixer<A extends Animal>

所以,你有boundtype的可以与Mixer类相关联Animalsubtype。现在,因为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
于 2012-10-15T09:50:43.810 回答