2013-06-09 13 views
5

Rozważmy następującą sytuację:Hash zestaw, który przechowuje podklasy danej klasy JAVA

public abstract class Vegetable {}; 

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

public class Orange {}; 

Chodzi o to - Chcę moje HashSet przechowywać tylko coś rozciągający Vegetable, jak mam to zrobić? To powinno być proste ..

..ale Set <? extends Vegetable>() hs = new HashSet <? extends Vegetable>(); nie jest konstrukcja działa oczywiście Java chce mi określić, jaki rodzaj Set chcę - Tomato lub Cucumber, co będzie, jeśli po prostu chcesz coś warzywo?

Wolałbym nie używać żadnych odlewane ...

+9

Po prostu użyj 'Set set = new HashSet ()' – toniedzwiedz

+0

@ tania dlaczego nie spróbujesz 'Set '? – MarioDS

+1

Wiem, że chcesz uniknąć castingu, ale używanie kodu Toma i casting na Cucumber and Tomato jest prawdopodobnie najlepszą drogą do tego. – Russell

Odpowiedz

8

Podczas tworzenia

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

zestaw jest zdolny do przechowywania przedmiotów, które należą do dowolnej podklasy SomeType. W twoim przypadku, wszystko czego potrzebujesz to

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

Można to zrobić teraz:

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

Rozwiązanie to spowoduje błąd kompilacji:

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

miarę rzuca Jedź, nie musiałby rzutować obiektów na ich drodze do set. Jednakże, jeśli potrzebujesz konkretnego typu (tj. Nie tylko Vegetable) podczas pobierania, potrzebujesz rzutowania.

Powiązane problemy