Der Unterschied besteht darin, dass wir im ersten Schritt angeben, dass der Aufrufer eine Objektinstanz (eine beliebige Klasse) übergeben muss und ein anderes Objekt (eine beliebige Klasse, die nicht unbedingt vom gleichen Typ ist) zurückerhält.
Im zweiten Fall entspricht der zurückgegebene Typ dem Typ, der bei der Definition der Klasse angegeben wurde.
Example ex = new Example<Integer>();
Hier geben wir an, welcher Typ T sein wird, wodurch wir mehr Einschränkungen für eine Klasse oder Methode erzwingen können. Zum Beispiel können wir ein LinkedList<Integer>
oder instanziieren LinkedList<Example>
und wissen, dass wir beim Aufrufen einer dieser Methoden eine Integer- oder Example-Instanz zurückerhalten.
Das Hauptziel hierbei ist, dass der aufrufende Code angeben kann, welche Art von Objekten eine Klasse bearbeiten soll, anstatt sich auf Typumwandlung zu verlassen, um dies zu erzwingen.
Siehe Java Generics * von Oracle.
* Link aktualisiert.
Sie müssen kein zusätzliches Klassencasting durchführen. Im ersten Fall erhalten Sie immer ein Objekt der Klasse java.lang.Object, das Sie in Ihre Klasse umwandeln müssen. Im zweiten Fall wird T durch die in der generischen Signatur definierte Klasse ersetzt, und es ist kein Klassencasting erforderlich.
quelle
Zur Laufzeit nichts. Zur Kompilierungszeit führt die zweite jedoch eine Typprüfung durch, um sicherzustellen, dass der Typ des Parameters und der Typ des Rückgabewerts mit dem Typ T übereinstimmen (oder Untertypen sind), in den der Typ T aufgelöst wird (das erste Beispiel führt auch eine Typprüfung durch, aber jedes Objekt ist a Subtyp des Objekts, so dass jeder Typ akzeptiert wird).
quelle
T ist ein generischer Typ. Dies bedeutet, dass es zur Laufzeit durch ein beliebiges qualifizierendes Objekt ersetzt werden kann. Sie können eine solche Methode wie folgt aufrufen:
String response = doSomething("hello world");
ODER
MyObject response = doSomething(new MyObject());
ODER
Integer response = doSomething(31);
Wie Sie sehen können, gibt es hier Polymorphismus.
Wenn jedoch deklariert wird, dass Object zurückgegeben werden soll, können Sie dies nur tun, wenn Sie Cast-Dinge eingeben.
quelle
<T>
es kein Autoboxing gibt?Im ersten Fall wird ein Parameter eines beliebigen Typs egstring verwendet und ein Typ foo zurückgegeben. Im zweiten Fall wird ein Parameter vom Typ foo verwendet und ein Objekt vom Typ foo zurückgegeben.
quelle
Es gibt einige Gründe, warum Sie Generics über den Objekttyp in Java in Betracht ziehen können:
quelle