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?
* è possibile utilizzare <> senza utilizzare un codice html qui? * => Sì, vedere le mie modifiche. Raramente hai bisogno di usare html su SO. – assylias
+1 Per la tua ricerca precedente. È una cosa rara su questo sito, purtroppo. –
@assylias ringrazia per quello. Ora, se solo potessi ricordare che la prossima volta ho bisogno di fare una domanda. – Legowaffles