Groovy Map und Java Map auf Generics

8

Ich bin neu bei Groovy und habe eine Frage bezüglich der Verwendung von map:

Ich weiß, dass ich tun kann:

def map = [key:"value"]

Aber was bedeutet es, wenn ich das tue:

Map<String, String> map = ["1":1, "2":"2"]

Dieser Code wird kompiliert, aber die Map ist nicht wirklich eine String- & gt; String-Map:

map.each({println it.key + ":" + it.value + "[" + it.value.class + "]"})

Es druckt:

  

1: 1 [Klasse java.lang.Integer]

     

2: 2 [Klasse java.lang.String]

Kann mir jemand helfen, zu verstehen, wie eine Map, die explizit mit String- & gt; String typisiert wurde, einem Map-Objekt zugewiesen werden kann, das String- & gt; Integer enthält? Danke!

=== Aktualisieren ===

Danke für den Link von @GrailsGuy, wenn ich @TypeChecked für die Wenn der obige Code in einer Methode eingeschlossen ist, wird ein Fehler ausgegeben:

[Static type checking] - Incompatible generic argument types. Cannot assign java.util.Map <java.lang.String, java.io.Serializable> to: java.util.Map <String, String>

Die Erklärung macht jetzt vollkommen Sinn.

    
Eric 02.04.2013, 02:49
quelle

2 Antworten

6

Dieser Forenbeitrag spricht über Groovy Ignoring Generics, insbesondere:

  

Groovy ist dynamisch getippt   Sprache, aber Sie können die Arten von Variablen statisch deklarieren.   Generics auf der JVM werden zur Kompilierzeit gelöscht und nur der unformatierte Typ   ist für die VM verfügbar (dies gilt sowohl für groovy als auch für Java). Im   Java, es gibt Kompilierzeitprüfung, um sicherzustellen, dass Sie nicht stopfen   int in eine Liste von Strings. Aber Groovy prüft die Typen nicht   Kompilierzeit.

     

Das bedeutet also, dass der Typparameter zur Kompilierzeit nicht überprüft wird   und zur Laufzeit nicht verfügbar.

    
Igor 02.04.2013, 03:05
quelle
1

Eric,

Ich vermute, dass dies durch eine Art Löschung verursacht wird hier und hier . Da groovy in Byte-Code kompiliert wird, werden auf der Byte-Code-Ebene die parametrisierten Typen entfernt. Also,

Map<String, String> objMap is compiled into Map objMap .

Es besteht also aus Schlüsseln und Objektwerten. Das ist der Grund, warum groovy Code kompiliert und ohne Fehler läuft. Hoffe, das hilft.

    
aces. 02.04.2013 03:04
quelle

Tags und Links