ich nicht völlig mit der akzeptierte Antwort zustimmen, in dem es heißt:
in einem solchen Fall, können Sie den Compiler ein wenig Hilfe von explizitgeben müssenzeigt den Rückgabetyp an, den Sie erwarten.
Das klingt nicht richtig für mich. Wenn ich die generische Methode und die Typinferenz verstehe, gibt der in eckigen Klammern angegebene Typ nicht direkt den Rückgabetyp der generischen Methode an. Stattdessen könnte der Typ T
Rückgabetyp, Argumenttyp, lokaler Variablentyp sein, der der generischen Methode zugeordnet ist.
Eigentlich müssen wir dank Typ-Inferenz-Mechanismus in den meisten Fällen den Typ-Parameter T
nicht angeben (nicht nur in einigen Situationen). In Ihrem Beispiel kann die <T>
wie in den meisten anderen Fällen vom Methodenaufruf ObjectGenerator.<T> getObject(objectName)
ausgeschlossen werden. Dies liegt daran, dass der Typ T
des generischen Verfahrens leicht aus dem Typ, dem das Ergebnis zugewiesen wird, oder zurückgegeben werden kann. Mit anderen Worten, da Sie vor dem Methodenaufruf private T object
deklarieren, wird der Typ T
erfolgreich als T
gefolgert.
Mein Anspruch kann durch die folgende Aussage von a definitive tutorial gesichert werden:
Typ-Inferenz ist ein Java-Compiler in der Lage ist, zu betrachten jede Methode Aufruf und eine entsprechende Erklärung des Typs Argument (oder Argumente) zu bestimmen das macht den Aufruf anwendbar. Der Inferenzalgorithmus bestimmt die Typen der Argumente und, falls verfügbar ist, den Typ, dem das Ergebnis zugewiesen oder zurückgegeben wird. Schließlich versucht der Inferenzalgorithmus den spezifischsten Typ zu finden, der mit allen Argumenten funktioniert.
Zwei Beispiele darüber, wie die Inferenz funktioniert:
static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
Der Typ T
als Serializable
basierend auf dem ausgewiesenen Zessionar Typ abgeleitet.
public static <U> void addBox(U u, java.util.List<Box<U>> boxes) {}
BoxDemo.<Integer>addBox(Integer.valueOf(10), listOfIntegerBoxes);
Der Typ U
als Integer
basierend auf dem Typ des übergebenen Argument abgeleitet wird (d.h. Integer.valueOf(10)
ist vom Typ Integer
). Daher kann <Integer>
in dem obigen Methodenaufruf sicher weggelassen werden.
Zusammenfassend können wir, ohne den Typparameter der generischen Methode aus dem Argumenttyp oder dem Typ, dem das Ergebnis zugewiesen oder zurückgegeben wird (beim Aufruf der Methode), die Typspezifikation sicher weglassen direkt vor dem Methodenaufruf.
+1 für ich habe das vorher nicht gesehen. –
Ich frage nicht nach Sinn, sondern nur etwa eine Zeile Code. Ich kann die Methodensignatur in ' T getObject (String name, Klasse clazz)' ändern - es spielt keine Rolle. Nur diese eine Zeile mit Aufruf dieser Methode mit '' ist für mich verwirrend –
emka86