2013-08-09 13 views
8

Od Effective Java Rozdział 5 (rodzajowych):Rodzaj vs bezgranicznej zamiennika

// Two possible declarations for the swap method 
public static <E> void swap(List<E> list, int i, int j); 
public static void swap(List<?> list, int i, int j); 

Która z tych dwóch deklaracji jest lepsze i dlaczego? W publicznym interfejsie API drugi jest lepszy, ponieważ jest prostszy. Przekazujesz listę - dowolną listę - a metoda zamienia zindeksowane elementy. Nie ma niepotrzebnego parametru typu. Z reguły jeśli parametr typu pojawia się tylko raz w deklaracji metody, zastąp go symbolem wieloznacznym.

Nie rozumiem, dlaczego druga opcja jest prostsza dla klienta mojego API? Mogę przekazywać te same parametry do pierwszej i drugiej metody. Również drugi wymaga metody pomocniczej do przechwytywania symboli wieloznacznych. Czy ktoś może wyjaśnić, dlaczego drugi jest zalecany? Dzięki!

+0

Możliwe odpowiedzi: http://stackoverflow.com/questions/6231973/difference-between-list-list-list-liste-and-listobject?rq=1 –

Odpowiedz

10

Często zadawane pytania na temat Java Generics są doskonałym źródłem odpowiedzi na tego typu pytania. Omówiono je szczegółowo w artykule Which one is better: a generic method with type parameters or a non-generic method with wildcards? oraz w późniejszych analizach przypadków.

Angelika Langer dochodzi do wniosku:

Wnioski: We wszystkich tych przykładach jest to głównie kwestia gustu i stylu, czy wolisz rodzajową lub wersję wieloznaczny. Zwykle kompromis pomiędzy łatwością implementacji (wersja ogólna jest często łatwiejsza do wdrożenia) i złożonością podpisu (wersja wieloznaczna ma mniej parametrów typu lub wcale).

Prostsze podpis metoda -> łatwiejsze do zrozumienia (nawet wtedy, gdy oba są stosowane w ten sam sposób) -> dobry w publicznych API (kompromis: bardziej skomplikowane wdrożenia)

ale całość jest lekki problem i z mojego doświadczenia wynika, że ​​spójność całego API jest o wiele ważniejsza niż styl, którego używasz.

+2

Popraw swoją odpowiedź, zamiast tylko oznaczać ją jako link odpowiedź. Przynajmniej skopiuj odpowiednią treść linku w swojej odpowiedzi w formie wyceny (użyj symbolu '>' na początku akapitu). –