Java泛型扩展

Baz*_*uka 3 java

让我说我有: public class Animal{..}

public class Cat extends Animal {...}

public MakeNoise(Class<? extends Animal> animal1,
                 Class<? extends Animal> animal2){..}
Run Code Online (Sandbox Code Playgroud)

为什么不MakeNoise(new Animal(),new Animal())编译?

虽然MakeNoise(new Cat(),new Cat())编译.

有没有办法解决它而不添加动物接口,并做:

Class<? extends AnimalInterface>
Run Code Online (Sandbox Code Playgroud)

Nic*_*tto 5

为什么不MakeNoise(new Animal(),new Animal())编译?

因为new Animal()创建的实例Animal不是实例Class.实际上,当您处理Class<? extends Animal>实例时,Class它指的是该类的子类型.AnimalAnimal

你试图实现的是这样的:

public MakeNoise(Animal animal1, Animal animal2){..}
Run Code Online (Sandbox Code Playgroud)

或者假设这MakeNoise是一个类,您可以在下一个类定义上定义泛型:

public class MakeNoise<X extends Animal, Y extends Animal> {
    public MakeNoise(X animal1, Y animal2){..}   
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以打电话了

MakeNoise makeNoise1 = new MakeNoise(new Cat(), new Cat());
MakeNoise makeNoise2 = new MakeNoise(new Animal(), new Animal());
Run Code Online (Sandbox Code Playgroud)

如果MakeNoise应该是一个方法(如果你的问题中有一个拼写错误,因为没有返回的类型),你也可以在方法定义中定义泛型类型,如下例所示:

<X extends Animal, Y extends Animal> void MakeNoise(X animal1, Y animal2) {...}
Run Code Online (Sandbox Code Playgroud)

虽然MakeNoise(new Cat(),new Cat())编译.

由于前面描述的相同原因,这无法编译