Можно ли написать единственный метод, который принимает универсальный параметр различной абстракции? - PullRequest
4 голосов
/ 29 марта 2012

Как продолжение к этому вопросу , возможно ли написать единственный метод, который добавляет 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 Ответ

5 голосов
/ 29 марта 2012

Вы используете Room в качестве потребителя, поскольку он принимает новый Dog, поэтому применяется знаменитая PECS аббревиатура Джоша Блоха .

void addDogToDogRoom(Room<? super Dog> room) {
  room.add(new Dog());
}
...