2013-03-08 11 views
17

Powiedzmy mam następujących klas:Dodawanie do Generic Zestaw przekazywane do metody

  • Animal
  • Cat
  • Dog
  • Krowa

zwierząt jest podstawa klasa, kot, pies i krowa dzielą je na podklasy.

Mam teraz Set<Cat>, Set<Dog> i Set<Cow> każda z nich są stosowane w taki sam sposób, więc ma to sens, aby rodzajowe funkcji do działania na nich

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

to działa świetnie, mogę dowolnie przechodzić w moich zestawach bez problemu.

Pojawia się problem: Nie mogę dodać zwierzęcia, które ma być dodane do parametrów. Googling ujawnia, że ​​jeśli zmienię metodę odczytu:

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

Będę w stanie dodać zwierzę do parametru vals. To działa, z wyjątkiem teraz, nie mogę przejść w mojej subklasie moje Zestawy koty, psy i krowy. Dalsze badania mówi mi, że następujące prace, bez ostrzeżenia do bagażnika:

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

Problem jest, muszę być w stanie wykonać wywołuje metodę, że wszyscy mają zwierzęcia. To jest łatwo zdobyć wokół pomocą prostego Obsada:

((Animal)toAdd).getAnimalType() 

Czy istnieje sposób wokół tego problemu, więc mogę zachować ogólną funkcjonalność, a nie wymagają odlewania? Oprócz tworzenia moich zestawów wszystkie zestawy typu podstawowego, zwierzę w przypadku tego przykładu?

+2

* czy jest sposób, w jaki mogę użyć <> bez użycia kodu HTML? * => Tak, zobacz moje zmiany. Rzadko musisz używać html na SO. – assylias

+2

+1 Dla twoich wcześniejszych badań. To rzadkość na tej stronie, niestety. –

+0

@assylias dzięki za to. Teraz, gdybym tylko pamiętał, że następnym razem będę musiał zadać pytanie. – Legowaffles

Odpowiedz

13

Dobre badania, byłeś już prawie na miejscu. Musisz tylko dodać górną granicę do T.

private <T extends Animal> boolean addObject(T toAdd, T defVal, Set<? super T> vals) 
+1

Dzięki, to działa. Oznaczę to jako odpowiedź w 8 minut, jeśli to możliwe. – Legowaffles

+0

Przydałoby się wyjaśnić, co oznacza ta sygnatura metody. Oznacza to: "Biorąc pod uwagę pewien typ" T ", który jest albo" Zwierzęiem ", albo podklasą" Zwierząt "(jak' Kot'), ta metoda przyjmuje dwa argumenty typu "T" plus "Zestaw" albo 'T' (jak 'Set ') lub jakiegoś typu, który jest nadtypem 'T' (jak' Set ')." Pomijając '? super' z argumentu 'Set' nadal pozwalałoby na działanie tego, po prostu nie z' Set '. Ale 'Set 'nie działa, ponieważ' "oznacza" jakiś typ, który jest albo "Animal" albo podklasą 'Animal' *, ale nie wiem, która podklasa *." –

Powiązane problemy