2013-06-09 2 views
5

consideri la seguente situazione:Hash set che memorizza sottoclassi di JAVA certa classe

public abstract class Vegetable {}; 

public class Tomato extends Vegetable {}; 
public class Cucumber extends Vegetable {}; 

public class Orange {}; 

Il punto è - voglio che il mio HashSet a memorizzare solo qualcosa che si estende Vegetable, come faccio a fare questo? Questo dovrebbe essere semplice ..

..ma Set <? extends Vegetable>() hs = new HashSet <? extends Vegetable>(); non è una costruzione che funziona ovviamente, Java mi vuole specificare il tipo di Set voglio - Tomato o Cucumber, che cosa se voglio solo qualcosa di vegetale?

preferirei non utilizzare alcun calchi ...

+9

Basta usare 'Imposta set = new HashSet ()' – toniedzwiedz

+0

@tania perché non provare semplicemente 'Set '? – MarioDS

+1

So che vuoi evitare il casting, ma usare il codice di Tom e il casting per Cucumber e Tomato è probabilmente il modo migliore per farlo. – Russell

risposta

8

Quando si crea

Set<SomeType> = new HashSet<SomeType>(); 

il set è in grado di memorizzare oggetti che appartengono a qualsiasi sottoclasse di SomeType. Nel tuo caso, tutto ciò che serve è

Set<Vegetable> set = new HashSet<Vegetable>(); 

Puoi farlo adesso:

set.add(new Tomato()); 
set.add(new Cucumber()); 

Facendo questo attiverà un errore di compilazione:

set.add(new Orange()); // Does not compile 

Per quanto getta andare, non avrebbe bisogno di lanciare oggetti sulla loro strada nel set. Tuttavia, se hai bisogno di un tipo specifico (ad esempio non semplicemente Vegetable) sul recupero, ti occorrerebbe un cast.