Wie wird hier auf den generischen Typ geschlossen?

8
%Vor%

Ich sah einen ähnlichen Code in Google Guava (als Factory-Methoden) zum Erstellen von Instanzen von Hashmap, ohne die generischen Typen zu erwähnen. Ich verstehe nicht, wie das generische vom obigen Programm abgeleitet wird. Ich meine, wie kann die Funktion getHashMap verstehe den Typ der Karte, da ich keine Typinformationen an die Funktion übergebe.

    
Emil 21.09.2010, 12:50
quelle

3 Antworten

6

Die Funktion getHashMap muss nicht auf die Typen schließen. Es ist an der Aufrufseite, dass javac von der Java Language Spec benötigt wird, um zu folgern, dass die Typen übereinstimmen ( 15.12.2.7 Einfügung von Typargumenten basierend auf tatsächlichen Argumenten ).

Ich glaube, der aktuelle Plan ist (noch) für JDK7, den Diamantenoperator zu unterstützen, also wird diese Art von Sache auch mit new funktionieren, wenn auch mit einer scheinbar sinnlosen Syntax.

%Vor%     
Tom Hawtin - tackline 21.09.2010, 12:54
quelle
1

Auf der Bytecode-Ebene wird die Methode einen Deskriptor haben, der nur besagt, dass es eine Methode mit dem Namen getHashMap gibt, die keine Argumente annimmt und eine Map (keine Generika) zurückgibt.

Wenn dann der Compiler die Zeile Map<String, Map<Long, List<String>>> map = getHashMap(); analysiert und es sagt, ok, muss ich eine Variable mit einem deklarierten Typ von Map<String, Map<Long, List<String>>> haben, aber um die Instanz zu bekommen, die ich brauche, um eine Methode aufzurufen. An diesem Punkt ist es die Aufgabe des Compilers, zu überprüfen, ob der Rückgabetyp der Methode mit dem deklarierten Typ der Variablen übereinstimmt, der Sie dieses Ergebnis zuweisen. Also überprüft es, ob String mit K übereinstimmt, und wenn Map<Long, List<String>> mit V übereinstimmt, was sie tun, so dass die Zuweisung typsicher ist und den Bytecode generiert, der grundsätzlich eine Map (keine Generika) -Variable verwendet / p>

Wenn Sie Ihre Methode wie folgt deklariert hätten:

%Vor%

Bei der Analyse der Zuweisung würde der Compiler sehen, dass String nicht mit K extends Number übereinstimmt, einen Kompilierungsfehler auslösen würde und keinen Bytecode für diese Zuweisung erstellen würde.

    
Andrei Fierbinteanu 21.09.2010 14:31
quelle
1
%Vor%

Java führt aus, dass T im ersten Fall String ist, Integer im zweiten Fall.

Was bedeutet "ableiten"? Es bedeutet, dass Java rät, dass in den beiden Anweisungen der Programmierer am liebsten T == String im ersten Fall, T == Integer für den zweiten Fall, ein netter Typ, Java nimmt diese Annahmen als Tatsache, und Programmierer nicht müssen die Ts

manuell angeben %Vor%

Aber wirklich, Java diktiert , dass der Rückgabetyp T so bestimmt werden muss.

Ich finde dieses Ding sehr fischig, nicht sicher, was der Grund für das Design ist. Wahrscheinlich, wenn (wenn) Java korrigierbare Typen hinzufügt (d. H. Die reale Klasse von T ist zur Laufzeit verfügbar), macht das Design mehr Sinn:

%Vor%

Ich mag immer noch nicht, dass der Typ einer Methode kontextabhängig ist.

    
irreputable 21.09.2010 17:49
quelle

Tags und Links