2013-04-02 7 views
8

にGroovyのマップとJavaマップ私はGroovyのに新しいです、と私はマップの使用について質問があります。ジェネリック医薬品

私は私が行うことができます知っている:

def map = [key:"value"]

しかし、何んの私はこれを行う場合、それは意味:

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

をこのコードはコンパイルされますが、マップは本当にストリング]> [文字列のマップではありません。

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

それは印刷されます。

1:1[class java.lang.Integer]

2:2[class java.lang.String]

ができ、誰もが、私は明示的にストリング]> [文字列で入力されたマップは、ストリング]>整数が含まれているマップオブジェクトに割り当てることができますどのように来る理解するのに役立ちますか?ありがとうございました!

=== ===更新@GrailsGuyによって提供されるリンクについて

おかげで、私はこの方法に包まれた上記のコードのため@TypeCheckedを使用していた場合、それはエラーがスローされます。

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

今説明は完全に理にかなっています。

答えて

6

このforum post会談、:

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

うーん...その後Groovyで一般的な構文を許可するポイントは何ですか? – ZhongYu

+1

@ zhong.j.yuコンパイラーの構文チェッカーが大変です。コンパイル時に特に型の強制はほとんどありません。 Groovyはタイプ強制の観点から非常に緩いものであり、 'Object'タイプを広く使用しています – Reimeus

+0

genericsをまったくサポートしていないとコンパイラが幸せにならないでしょうか? – ZhongYu

1

エリック、

は、私は、これは型消去によって引き起こさherehereを説明している疑いがあります。 groovyはバイトコードにコンパイルされているので、バイトコードレベルでパラメータ化された型は削除されます。従って、

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

これはキーとオブジェクトの値で構成されています。これはGroovyコードがエラーなしでコンパイルされ実行される理由です。 これが役立つことを願っています。特にGroovyの無視ジェネリック医薬品について

関連する問題