2013-06-09 7 views
5

Betrachten Sie die folgende Situation speichert:Hash-Set, das Subklassen von bestimmten Klasse JAVA

public abstract class Vegetable {}; 

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

public class Orange {}; 

Der Punkt ist - ich möchte, dass meine HashSet nur zu speichern, etwas erstreckt Vegetable, wie kann ich das tun? Dies sollte einfach sein ..

..aber Set <? extends Vegetable>() hs = new HashSet <? extends Vegetable>(); ist keine Arbeits Bau natürlich Java will, dass ich angeben, welche Art von Set ich will - Tomato oder Cucumber, was passiert, wenn ich etwas Gemüse nur wollen?

Ich würde lieber keine Abgüsse verwenden, um ...

+9

Verwenden Sie einfach 'Set set = neue HashSet ()' – toniedzwiedz

+0

@tania warum versuchst du nicht einfach 'Set ' '? – MarioDS

+1

Ich weiß, dass Sie Casting vermeiden möchten, aber Toms Code und Casting für Gurke und Tomate ist wahrscheinlich der beste Weg dazu. – Russell

Antwort

8

Wenn Sie

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

die Menge speichern kann Objekte erstellen, die zu einer Unterklasse von SomeType gehören. In Ihrem Fall alles, was Sie brauchen, ist

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

du jetzt tun können:

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

Dadurch wird einen Compiler-Fehler auslösen:

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

Soweit gehen wirft, Sie würde keine Objekte auf dem Weg in die set werfen müssen. Wenn Sie jedoch beim Abrufen einen bestimmten Typ (d. H. Nicht einfach Vegetable) benötigen, benötigen Sie eine Besetzung.