Можно ли написать единственный метод, который принимает универсальный параметр различной абстракции?
В качестве продолжения этого вопроса можно ли написать один метод, который добавляет Dog
в подходящую комнату? (В этом примере он будет принимать либо Animal
комната или Dog
комната.) Или я вынужден написать два разных метода, как показано ниже? (Я даже не могу полагаться на перегрузку из-за стирания типа).
public class Rooms {
interface Animal {}
class Dog implements Animal {}
class Room<T> {
void add(T t) {}
}
void addDogToAnimalRoom(Room<Animal> room) {
room.add(new Dog());
}
void addDogToDogRoom(Room<Dog> room) {
room.add(new Dog());
}
}
1 ответ
Решение
Вы используете Room
как потребитель, так как он принимает новый Dog
, поэтому применяется известная аббревиатура PECS Джоша Блоха.
void addDogToDogRoom(Room<? super Dog> room) {
room.add(new Dog());
}