2010-04-27 11 views
5

heute Morgen stieß ich auf diesen Code, und ich habe absolut keine Ahnung, was das bedeutet. Kann mir jemand erklären, was diese <T> darstellen? Zum Beispiel:Code Erklärung in Java

public class MyClass<T> 
... 

some bits of code then 

private Something<T> so; 

private OtherThing<T> to; 

private Class<T> c; 

Danke

Antwort

13

Sie sind auf "Generika" gestoßen. Sie werden in dieser guide sehr schön erklärt.

Kurz gesagt, können Sie angeben, welchen Typ eine Speicherklasse, wie List oder Set enthält. Wenn Sie Set<String> schreiben, haben Sie festgestellt, dass dieser Satz nur String s enthalten muss und wird ein Übersetzungsfehler, wenn Sie versuchen, es etwas anderes in setzen:

Set<String> stringSet = new HashSet<String>(); 
stringSet.add("hello"); //ok. 
stringSet.add(3); 
     ^^^^^^^^^^^ //does not compile 

Des Weiteren ein weiteres gutes Beispiel dafür, was Generika tun können ist, dass sie Ihnen näher eine abstrakte Klasse angeben lassen:

public abstract class AbstClass<T extends Variable> { 

auf diese Weise werden die Verlängerung Klassen muss nicht Variable verlängern, aber sie müssen erweitern eine Klasse, die Variable erstreckt.

Dementsprechend wird ein Verfahren, das ein AbstClass Griffe können wie folgt definiert werden:

public void doThing(AbstClass<?> abstExtension) { 

wo ? ist ein Platzhalter, dass „alle Klassen, die mit einigen AbstClassVariable verlängern“ bedeutet.

+0

@Lars Andren Ok Ich denke, ich habe die Erklärung, warum sollte jemand Generika im Klassennamen verwenden, ich meine, gibt es eine Anwendung, indem Sie es verwenden oder nicht? –

+0

Sie können einem Klassennamen nicht wirklich Generika hinzufügen, aber Sie können dem Klassenheader (Definition) Generika hinzufügen. Die Vorteile der Verwendung sind weniger Güsse und verbesserte Lesbarkeit unter anderen; http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#Topic1 –

5

Was Sie hier sehen, so genannte Generika ist. Sie wurden in Version 1.5 in Java eingeführt.

Sie können über sie here und here lesen. Hoffe das hilft.

0

Was Sie sehen, ist Java generics, die Klassen und Methoden von anderen Klassen parametrisiert werden können. Dies ist besonders nützlich beim Erstellen von Containerklassen, da Sie dadurch separate Klassen für "eine Liste von ganzen Zahlen", "eine Liste von Strings" usw. erstellen müssen. Stattdessen können Sie eine einzelne "Liste eines Typs T, wo T ist eine Variable "und dann können Sie die Liste für einen bestimmten Typ T instanziieren. Beachten Sie, dass Java-Generika nicht ganz die gleichen sind wie Schablonentypen in C++; Java-Generics verwenden tatsächlich dieselbe Klassendefinition, fügen aber implizites Casting hinzu (vom Compiler generiert) und fügen zusätzliche Typprüfungen hinzu. Die verschiedenen Instanziierungen verwenden jedoch denselben genauen Typ (dies wird als Löschen bezeichnet), bei dem die parametrisierten Typen durch Object ersetzt werden. Sie können mehr darüber unter dem Link lesen.

1

Stellen Sie sich vor, Sie schreiben eine List- oder Array-Klasse. Diese Klasse muss Elemente eines unbekannten Typs enthalten können. Wie machst du das?

Generics beantwortet diese Frage. Diese <T>, die Sie sehen, kann als some type gelesen werden. Mit Generika können Sie class MyList<T> { ... } schreiben, was in diesem Zusammenhang a list that holds some type bedeutet.

Als Anwendungsbeispiel, um eine Liste zu speichern ganze Zahlen erklären, MyList<Integer> listOfInts oder Strings, MyList<String> listOfStrings oder eine Klasse, die Sie selbst MyList<MyClass> listOfMyClass geschrieben haben.

0

Da noch niemand es erwähnt hat, gibt es eine sehr umfangreiche Anleitung/FAQ/Tutorial zu Generika, die unter Angelika Langer's site zu finden sind.

+0

Eigentlich war das bereits mit Lars Andrens Antwort verknüpft: http://stackoverflow.com/questions/2719776/code-explanation-in- Java/2719918 # 2719918 – Jonik