2009-06-29 18 views

Antwort

14

Es ist die Verwendung von Generika. Überprüfen Sie diese intro aus. Und dann vergessen Sie nicht, diese tutorial zu lesen.

Ein Auszug folgt (die die Verwendung eines Gusses im Vergleich zum Einsatz von Generika vergleicht):

Wenn Sie den Code < Typen sehen>, es als „Typ“ lesen; Die Deklaration über lautet wie "Collection of String c." Der Code mit Generics ist klarer und sicherer. Wir haben eine unsichere Besetzung und eine Reihe von zusätzlichen Klammern eliminiert. Noch wichtiger ist, haben wir Teil der Spezifikation der Methode von einem Kommentar zu seiner Unterschrift bewegten, so kann der Compiler bei der Kompilierung überprüfen, ob die Art Einschränkungen nicht zum Laufe Zeit verletzt werden. Da das Programm ohne Warnungen kompiliert, können wir mit Sicherheit sagen, dass es eine ClassCastException zur Laufzeit nicht werfen wird. Der Nettoeffekt der Verwendung von Generika, insbesondere in großen Programmen, ist verbesserte Lesbarkeit und Robustheit.

Zum Beispiel kann die Schnittstelle einer Liste ist

public interface List<E> { 
    void add(E x); 
    Iterator<E> iterator(); 
} 

Dies bedeutet, dass Sie eine Liste, deren Inhalt alle vom gleichen expliziten Typ aufbauen können (nicht nur vom Typ Object), auch wenn Sie Definieren Sie den Typ selbst. Also, wenn Sie einen Namen Klasse erstellen können Sie

List<Name> nameList = new List<Name>(); 

schreiben und dann füllen Sie es mit Namen Instanzen und direkt Namen Instanzen von ihr abrufen, ohne sich um sie zu werfen oder sonst Sorgen machen, weil Sie immer entweder einen Namen bekommen Instanz oder Null zurück, nie eine Instanz eines anderen Typs.

Noch wichtiger ist, dass Sie in einer solchen Liste nichts anderes als eine Name-Instanz einfügen können, da dies bei der Kompilierung fehlschlägt.

nameList.add(false); //Fails! 
nameList.add(new Name("John","Smith")); //Succeeds supposing Name has a 
             //firstName, lastName constructor 
+0

Ich lese 'List ' als "Liste der Typen", als ob T für Typ kurz ist. Ich habe ' 'in einer Menge Code bemerkt. Ist es kurz für irgendetwas? Oder sollte ich es einfach als "Collection of Es" lesen – Aust

16

Es bedeutet, dass es sich um eine Sammlung von Elementen mit dem Typ E handelt. Stellen Sie sich vor, Sie haben eine Tasse Tee. Statt Tee, könnte es auch Kaffee halten, so dass es sinnvoll, die Schale als Gattungs Einheit zu beschreiben, macht:

class Cup<T> { … } 

jetzt Sie es füllen könnten, entweder mit Kaffee oder Tee (oder etwas anderes):

Cup<Tea> cuppa = new Cup<Tea>(); 
Cup<Coffee> foamee = new Cup<Coffee>(); 

Damit dies funktioniert, müssen sowohl Tea als auch Coffee Typen sein, die in Ihrem Programm definiert sind.

Dies ist eine Kompilierungszeitbeschränkung auf Ihrem Code.Wenn aus dem (eher nutzlosen) Becherbeispiel zurückgekehrt wird, enthalten Auflistungen (Arrays, Listen, ...) üblicherweise Elemente vom Typ , z. B.. ganze Zahlen oder Strings. Generics hilft Ihnen, dies in Java auszudrücken:

Beachten Sie den obigen Kompilierfehler? Sie erhalten dies nur, wenn Sie Generika verwenden. Der folgende Code funktioniert auch, aber würde nicht die nette Fehlermeldung geben:

Collection strList = new ArrayList(); 
strList.add("Foobar"); // Works. 
strList.add(42);  // Works now. Do we really want this?! 
+0

gute Erklärung :) – Johanna

+2

Eine Berührung verwirrend wie die Klasse Cup würde tatsächlich eine Tasse T ausgesprochen werden :) – johnc

+1

@ Lagerdalek: das entkam nicht meine Aufmerksamkeit überhaupt. ;-) In der Tat ist diese Erklärung von diesem inspiriert: http://www.zazzle.com/c_cup_of_t_mug-168503670567870702 –