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 Type
的Mixer
。
让我们看看出了什么问题:-
public <C extends Cat> Mixer<? super Dog> useMe(A a, C c)
返回类型
Mixer<? super Dog>
表示,您可以返回任何类型Mixer
的Dog
或Dog的super-type
,可能是Animal
。 //return new Mixer<Object>();//KO
return new Mixer<Animal>(); //OK
因此,两个
return
语句都可以正常工作,因为Animal
和Object
都是super-type
的Dog
。但是,
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