Можно ли написать единственный метод, который принимает универсальный параметр различной абстракции?

В качестве продолжения этого вопроса можно ли написать один метод, который добавляет 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());
}
Другие вопросы по тегам