2013-03-08 15 views
17

Diciamo Ho le seguenti classi:Aggiungendo a un generico insieme passato in un metodo

  • animali
  • Cat
  • Dog
  • Cow

animale è la base classe, gatto, cane e mucca ciascuna sottoclasse.

ora ho un Set<Cat>, Set<Dog> e Set<Cow> ciascuno di questi sono utilizzati nello stesso modo, quindi ha senso per effettuare una funzione generica per operare su di essi:

private boolean addObject(Animal toAdd, Animal defVal, Set<? extends Animal> vals) 

Questa grande opera, posso passare liberamente nei miei set senza problemi.

Il problema appare: non riesco a provare ad aggiungere l'animale da aggiungere al parametro vals. Googling rivela che se cambio il metodo per leggere:

private boolean addObject(Animal toAdd, Animal defVal, Set<? super Animal> vals) 

sarò in grado di aggiungere l'Animal al parametro vals. Funziona, tranne ora, non posso passare nella mia sottoclasse i miei gruppi di gatti, cani e mucche. Ulteriori ricerche mi dice che le seguenti opere, con nessun avviso per l'avvio:

private <T> boolean addObject(T toAdd, T defVal, Set<? super T> vals) 

Il problema è, ho bisogno di essere in grado di eseguire chiamate di metodo che di animali di tutti hanno. Questo è facilmente ottenuto in giro con un semplice getto:

((Animal)toAdd).getAnimalType() 

C'è un modo per risolvere questo problema in modo da poter mantenere la funzionalità generiche, e non richiede la fusione? Oltre a fare il mio Imposta tutti i Set del Tipo Base, Animale nel caso di questo esempio?

+2

* è possibile utilizzare <> senza utilizzare un codice html qui? * => Sì, vedere le mie modifiche. Raramente hai bisogno di usare html su SO. – assylias

+2

+1 Per la tua ricerca precedente. È una cosa rara su questo sito, purtroppo. –

+0

@assylias ringrazia per quello. Ora, se solo potessi ricordare che la prossima volta ho bisogno di fare una domanda. – Legowaffles

risposta

13

Buona ricerca, eri quasi arrivato. Hai solo bisogno di aggiungere un limite superiore a T.

private <T extends Animal> boolean addObject(T toAdd, T defVal, Set<? super T> vals) 
+1

Grazie, questo funziona. La contrassegnerò come risposta in 8 minuti circa, quando possibile. – Legowaffles

+0

Potrebbe essere utile precisare cosa significa questa firma di metodo. Significa: "Dato un certo tipo' T' che è o 'Animale' o una sottoclasse di 'Animale' (come' Cat'), questo metodo prende due argomenti di tipo 'T' più un' Set' di entrambi 'T' (come 'Set ') o di qualche tipo che è un supertipo di 'T' (come' Set ')." Omettendo il '? super' dall'argomento 'Set' permetterebbe comunque che funzioni, ma non con un' Set '. Ma 'Set 'non funziona, perché' significa "un tipo che è" Animale "o una sottoclasse di" Animale "* ma non so quale sottoclasse *." –

Problemi correlati