2013-03-08 16 views
17

Lassen Sie uns sagen, dass ich die folgenden Klassen:zu einem generischen Set Hinzufügen in eine Methode übergeben

  • Tier
  • Katze
  • Hund
  • Kuh

Tier ist die Basis Klasse, Katze, Hund und Kuh jede Unterklasse es.

Ich habe jetzt eine Set<Cat>, Set<Dog> und Set<Cow> jede dieser in gleicher Weise verwendet werden, so dass es sinnvoll ist, eine generische Funktion, um auf sich zu betreiben:

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

Dies funktioniert gut, kann ich gebe meine Sets ohne Probleme frei.

Das Problem wird angezeigt: Ich kann nicht versuchen, das Tier ToAdd zu Parameter Vals hinzuzufügen. Googeln zeigt, dass, wenn ich die Methode ändern lesen:

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

werde ich in der Lage, das Tier zu addieren vals Parameter. Dies funktioniert, außer jetzt, kann ich nicht in meine Unterklasse meine Sets von Katzen, Hunde und Kühe übergeben. Weitere Forschung sagt mir, dass die folgenden Werke, ohne Warnungen boot:

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

Das Problem ist, ich brauche Methode in der Lage sein auszuführen nennt das Tier die alle haben. Dies ist leicht um mit einem einfachen Guss bekommen:

((Animal)toAdd).getAnimalType() 

Gibt es eine Möglichkeit, um dieses Problem, so kann ich die allgemeine Funktionalität zu halten, und nicht erfordern Gießen? Abgesehen davon, dass ich meine Sets alle Sets des Basistyps mache, Animal im Fall dieses Beispiels?

+2

* Gibt es eine Möglichkeit, <> ohne einen HTML-Code hier zu verwenden? * => Ja, siehe meine Änderungen. Sie müssen selten HTML für SO verwenden. – assylias

+2

+1 Für Ihre vorherige Recherche. Es ist eine seltene Sache auf dieser Seite, leider. –

+0

@assylias danke dafür. Nun, wenn ich mich nur daran erinnern könnte, dass ich das nächste Mal eine Frage stellen muss. – Legowaffles

Antwort

13

Gute Forschung, Sie waren fast da. Sie müssen lediglich eine obere Grenze zu T hinzufügen.

+1

Danke, das funktioniert. Ich werde es als die Antwort in 8 oder so Minuten markieren, wenn möglich. – Legowaffles

+0

Es könnte nützlich sein, zu formulieren, was diese Methodensignatur bedeutet. Das bedeutet: "Bei einem Typ" T ", der entweder" Tier "oder eine Unterklasse von" Tier "(wie" Katze ") ist, verwendet diese Methode zwei Argumente vom Typ" T "plus ein" Satz "von entweder" T " (wie 'Set ') oder von einem Typ, der ein Supertyp von 'T' ist (wie' Set ')." Das "weglassen"? Super 'aus dem' Set' Argument würde dies immer noch funktionieren lassen, nur nicht mit einem 'Set '. Aber 'Set 'funktioniert nicht, weil' 'bedeutet" irgendeinen Typ, der entweder 'Animal' oder eine Unterklasse von' Animal' * ist, aber ich weiß nicht, welche Unterklasse *. " –

Verwandte Themen