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>?
问题不在于您的方法的返回类型,而是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-type狗Animal.
//return new Mixer<Object>();//KO
return new Mixer<Animal>(); //OK
Run Code Online (Sandbox Code Playgroud)
所以,无论是returnstatments 会工作得很好,因为,无论是Animal和Object是super-type的Dog.
但是,之所以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)
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |