2012-03-29 1 views
4

En tant que followup to this question, est-il possible d'écrire une seule méthode qui ajoute un Dog à une pièce appropriée? (Dans cet exemple, il accepterait une pièce Animal ou une pièce Dog.) Ou suis-je forcé d'écrire deux méthodes distinctes comme ci-dessous? (Je ne peux même pas compter sur la surcharge à cause de l'effacement du type).Est-il possible d'écrire une seule méthode qui accepte un paramètre générique d'abstraction variable?

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()); 
    } 
} 

Répondre

5

Vous utilisez Room en tant que consommateur, car il est d'accepter la nouvelle Dog, si Josh Bloch célèbre PECS acronym applique.

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

Oh * c'est ce que super est pour :) –

+3

Yep! Vous utilisez 'List' en tant que consommateur, car il accepte le nouveau chien, donc le célèbre acronyme PECS de Josh Bloch s'applique. –

+0

C'est le danger de la programmation "learn-as-you-go". Je "lis" son livre, mais seulement les parties qui étaient pertinentes à l'époque. Je pense que cela aurait pu me sauver beaucoup de refactoring inutile. N'hésitez pas à proposer (ou à modifier) ​​un meilleur titre de question. –

Questions connexes