2012-03-29 2 views
4

Как можно написать followup to this question, можно ли написать один метод, который добавит 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()); 
    } 
} 

ответ

5

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

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

Oh * это * какой super для :) –

+3

Yep! Вы используете «Список» в качестве потребителя, так как он принимает нового Собака, поэтому применяется знаменитое сокращение POSS Джоша Блоха. –

+0

Это опасность программирования обучения. Я «читал» его книгу, но только те части, которые были актуальны в то время. Я думаю, что понимание этого могло бы избавить меня от ненужного рефакторинга. Пожалуйста, не стесняйтесь предлагать (или просто редактировать) лучший заголовок вопроса. –