Как ограничить эти операции между одним и тем же объектом, несмотря на то, что в Java объявлен базовым типом - PullRequest
2 голосов
/ 23 февраля 2012

Я хочу написать метод, который получает объект того же типа, что и аргумент, но объявить его в базовом классе, но я не хочу, чтобы он принимал другой объект, производный от той же базы.

Например, у меня есть класс Animal, и я хочу написать метод sonOf (Animal a), но я не хочу, чтобы кто-то делал что-то подобное:

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

bolt.sonOf(mittens);

Я думаю, что дженерики нужны, но я не уверен, как правильно их использовать.

Спасибо.

1 Ответ

5 голосов
/ 23 февраля 2012

Hm. Вы можете попробовать, например:

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) { ... }
}

Тогда вы получите

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)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...