尽管在Java中声明为基类型,但如何限制操作将在同一对象之间

Sna*_*gon 2 java generics inheritance

我想编写一个方法来获取与参数类型相同的对象,但要在基类中声明它,但我不希望它接受从同一个基础派生的其他对象.

例如,我有类Animal,我想写一个方法sonOf(Animal a),但我不希望有人这样做:

Animal bolt = new Dog();
Animal mittens = new Cat();

bolt.sonOf(mittens);
Run Code Online (Sandbox Code Playgroud)

我认为需要一个泛型,但我不确定如何正确使用它.

谢谢.

Dir*_*irk 5

嗯.你可以尝试,例如:

abstract class Animal<T extends Animal<T>> {
    abstract void sonOf(T son);
}

final class Dog extends Animal<Dog> {
    void sonOf(Dog dog) { ... }
}

final class Cat extends Animal<Cat> {
    void sonOf(Cat cat) { ... }
}
Run Code Online (Sandbox Code Playgroud)

然后你得到

final Cat mom = new Cat();
final Cat child = new Cat();

child.sonOf(mom);

final Dog dad = new Dog();
child.sonOf(dad);          // "The method sonOf(Cat) in the type Cat is not applicable for the arguments (Dog)"
Run Code Online (Sandbox Code Playgroud)