Ich studiere derzeit Java und bin kürzlich von spitzen Klammern (<>) überrascht worden. Was genau meinen sie?
public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects = new ArrayList<T>(maxsize)
}
Was bedeutet das <T>
? Bedeutet das, dass ich ein Objekt vom Typ erstellen kann T
?
T createObject
sich in Pool oder PoolFactory befinden? Wothis.freeObjects = ...
soll sein? Ist das ein separates Beispiel? Es ist illegal, es dort zu haben; es muss innerhalb einer Methode sein.<>
(Diamantoperator) sucht, die beispielsweise verwendet werden können,List<Integer> list = new ArrayList<>();
besuchen Sie docs.oracle.com/javase/7/docs/technotes/guides/language/… .Antworten:
<T>
ist ein Generikum und kann normalerweise als "vom Typ T" gelesen werden. Es hängt vom Typ links vom <> ab, was es tatsächlich bedeutet.Ich weiß nicht, was ein
Pool
oderPoolFactory
ist, aber Sie erwähnen auchArrayList<T>
, dass es sich um eine Standard-Java-Klasse handelt, also werde ich damit sprechen.Normalerweise sehen Sie dort kein "T", sondern einen anderen Typ. Also wenn du siehst
ArrayList<Integer>
zum Beispiel sehen, bedeutet das "AnArrayList
vonInteger
s". Viele Klassen verwenden Generika, um beispielsweise den Typ der Elemente in einem Container einzuschränken. Ein anderes Beispiel istHashMap<String, Integer>
"eine Karte mitString
Schlüsseln undInteger
Werten".Ihr Pool Beispiel ist ein bisschen anders, weil es Sie definieren eine Klasse. In diesem Fall erstellen Sie also eine Klasse, die jemand anderes anstelle von T mit einem bestimmten Typ instanziieren könnte. Beispielsweise könnte ich
Pool<String>
mithilfe Ihrer Klassendefinition ein Objekt vom Typ erstellen . Das würde zwei Dinge bedeuten:Pool<String>
hätte eine SchnittstellePoolFactory<String>
mit einercreateObject
Methode, dieString
s zurückgibt .Pool<String>
würde das eineArrayList
von Strings enthalten.Das sind großartige Neuigkeiten, denn zu einem anderen Zeitpunkt könnte ich mitkommen und einen erstellen
Pool<Integer>
, der denselben Code verwendet, aberInteger
überall dort hat, wo Sie ihnT
in der Quelle sehen.quelle
Es ist wirklich einfach. Es ist eine neue Funktion, die in J2SE 5 eingeführt wurde . Wenn Sie nach dem Klassennamen eckige Klammern angeben, erstellen Sie einen temporären Datentyp, der jeden Datentyp enthalten kann.
Beispiel:
Stattdessen
<T>
können Sie tatsächlich alles schreiben und es funktioniert genauso. Versuchen Sie,<ABC>
anstelle von zu schreiben<T>
.Dies dient nur der Bequemlichkeit:
<T>
wird als beliebiger Typ bezeichnet<E>
als Elementtyp<N>
als Nummerntyp<V>
als Wert<K>
als SchlüsselAber Sie können es so nennen, wie Sie wollen, es spielt keine Rolle.
Darüber hinaus
Integer
,String
,Boolean
etc sind Wrapper - Klassen von Java , der Hilfe bei den Typen während der Kompilierung zu überprüfen. Der obige Codeobj
ist beispielsweise vom TypString
, sodass Sie keinen anderen Typ hinzufügen können (versuchen Sieobj.add(1)
, es wird ein Fehler ausgegeben). Ebensoobj1
ist vomInteger
Typ, Sie können keinen anderen Typ hinzufügen (versuchen Sieobj1.add("hello")
, Fehler wird da sein).quelle
Es ist verwandt mit Generika in Java. Wenn ich das erwähnt habe
ArrayList<String>
, bedeutet dies, dass ich dieser ArrayList nur Objekte vom Typ String hinzufügen kann.Die zwei Hauptvorteile von Generika in Java sind:
quelle
wird als generischer Typ bezeichnet. Sie können einen Objektpool wie folgt instanziieren:
Der generische Parameter kann nur ein Referenztyp sein. Sie können also keine primitiven Typen wie int oder double oder char oder andere primitive Typen verwenden.
quelle
<>
wird verwendet, um Generika in Java anzuzeigen .T
ist in diesem Beispiel ein Typparameter. Und nein: Instanziieren ist eines der wenigen Dinge, mit denen Sie nichts anfangen könnenT
.Abgesehen von dem oben verlinkten Tutorial ist Angelika Langers Generics FAQ eine großartige Ressource zu diesem Thema.
quelle
Generische Klassen sind Klassentypen, die beim Erstellen einen Datentyp als Parameter verwenden. Dieser Typparameter wird in spitzen Klammern angegeben und der Typ kann sich jedes Mal ändern, wenn eine neue Instanz der Klasse instanziiert wird. Erstellen wir beispielsweise eine ArrayList für Mitarbeiterobjekte und eine andere für Unternehmensobjekte
Sie werden feststellen, dass wir dieselbe ArrayList-Klasse verwenden, um beide Listen zu erstellen, und den Typ "Mitarbeiter" oder "Unternehmen" in spitzen Klammern übergeben. Wenn eine generische Klasse mehrere Datentypen verarbeiten kann, müssen viele Klassen, die ähnliche Aufgaben ausführen, reduziert werden. Generika helfen auch dabei, Fehler zu reduzieren, indem sie allen einen starken Typ geben, der dem Compiler hilft, auf Fehler hinzuweisen. Wenn Sie einen Typ für ArrayList angeben, gibt der Compiler einen Fehler aus, wenn Sie versuchen, einen Mitarbeiter zur Unternehmensliste hinzuzufügen oder umgekehrt.
quelle