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.
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.
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.