2013-08-09 8 views
8

Von Effective Java Kapitel 5 (Generika):Typ Parameter vs unbeschränkten Wildcard

// 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); 

Welche dieser beiden Erklärungen bevorzugt, und warum? In einer öffentlichen API ist die zweite besser, weil sie einfacher ist. Sie übergeben eine Liste - eine beliebige Liste - und die Methode vertauscht die indizierten Elemente. Es gibt keinen Typ-Parameter, um den Sie sich kümmern müssen. Wenn ein Typparameter in einer Methodendeklaration nur einmal angezeigt wird, ersetzen Sie ihn in der Regel durch einen Platzhalter.

Ich verstehe nicht, warum zweite Option ist einfacher für Client meiner API? Ich kann dieselben Parameter an die erste und zweite Methode weitergeben. Auch die zweite Methode benötigt eine Hilfsmethode für die Wildcard-Erfassung. Könnte jemand erklären, warum der zweite empfohlen wird? Danke!

+0

mögliche Antworten: http://stackoverflow.com/questions/6231973/difference-between-list-list-listt-liste-and-listobject?rq=1 –

Antwort

10

Die Java Generics FAQ ist eine großartige Quelle, um diese Art von Fragen zu beantworten und die "Wildcard vs. Generic" wird ausführlich in Which one is better: a generic method with type parameters or a non-generic method with wildcards? und den nachfolgenden Fallstudien diskutiert.

Angelika Langer kommt zu dem Schluss:

Fazit: In all diesen Beispielen ist es vor allem eine Frage von Geschmack und Stil, ob Sie die allgemeinen oder die Wildcard-Version bevorzugen. Es gibt normalerweise einen Kompromiss zwischen der Einfachheit der Implementierung (die generische Version ist oft einfacher zu implementieren) und der Komplexität der Signatur (die Platzhalterversion hat weniger Typparameter oder gar keine).

Einfachere Methode Signatur -> leichter zu verstehen (auch wenn beide die gleiche Art und Weise verwendet werden) -> gut in der Öffentlichkeit API (Kompromiss: komplexere Implementierung)

Aber das Ganze ist ein leichtes Thema und Nach meiner Erfahrung ist die Konsistenz über die gesamte API viel wichtiger als die Art, die Sie verwenden.

+2

Bitte verbessern Sie Ihre Antwort, anstatt nur als Link zu markieren Antworten. Kopieren Sie zumindest den relevanten Inhalt des Links in Ihrer Antwort in Anführungszeichen (verwenden Sie ein '>' Symbol am Anfang des Absatzes). –