2013-04-02 18 views
8

Sono nuovo a Groovy, e ho una domanda per quanto riguarda l'uso di carta:mappa Groovy e mappa Java su generici

so che posso fare:

def map = [key:"value"]

Ma che cosa significa significa se faccio questo:

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

questo codice viene compilato, ma la mappa non è in realtà una mappa String> stringa:

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

esso stampa:

1:1[class java.lang.Integer]

2:2[class java.lang.String]

Può chiunque mi aiuta a capire come mai una mappa in modo esplicito digitato con String> String può essere assegnato a un oggetto mappa che contiene String> Intero? Grazie!

Aggiornamento === ===

Grazie per il link fornito da @GrailsGuy, se sto usando @TypeChecked per il codice di cui sopra avvolto in un metodo, si genera un errore:

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

La spiegazione ha perfettamente senso ora.

risposta

6

Questo forum post parla di Groovy farmaci generici ignorando, in particolare:

Groovy is a dynamically typed language, but you can statically declare the types of variables. Generics on the JVM are erased at compile time and only the raw type is available to the VM (this is true both for groovy and Java). In Java, there is compile time checking to ensure that you don't stuff an int into a list of strings. But, Groovy does not check types at compile time.

So, this means that the type parameter is not checked at compile time and not available at runtime.

+0

hmm ... allora qual è il punto di consentire sintassi generica in Groovy? – ZhongYu

+1

@ zhong.j.yu Per mantenere il controllo della sintassi del compilatore heppy. L'applicazione di tipo molto piccolo è fatta soprattutto al momento della compilazione. Groovy è molto sciolto in termini di applicazione dei tipi e fa ampio uso dei tipi 'Object ' – Reimeus

+0

non sarebbe più felice il compilatore se non supporta affatto i generici? – ZhongYu

1

Eric,

ho il sospetto che questo è causato dalla cancellazione di tipo spiegato here e here. Poiché groovy è compilato in byte code, a livello di codice byte i tipi parametrizzati vengono rimossi. Pertanto,

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

Quindi è composto da chiavi e valori di oggetto. Questo è il motivo per cui il codice Groovy viene compilato ed eseguito senza errori. Spero che questo aiuti.