Generics上的Groovy地图和Java地图

时间:2013-04-02 02:49:43

标签: java groovy

我是Groovy的新手,我对使用map有疑问:

我知道我能做到:

def map = [key:"value"]

但是如果我这样做是什么意思:

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

此代码编译,但地图实际上不是String-&gt; String map:

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

打印:

  

1:1 [类java.lang.Integer]

     

2:2 [class java.lang.String]

任何人都可以帮助我理解如何使用String-&gt;显式地键入地图?可以将字符串分配给包含String-&gt; Integer的地图对象?谢谢!

===更新===

感谢@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>

现在解释很有道理。

2 个答案:

答案 0 :(得分:8)

这篇forum post讨论了Groovy忽略泛型,特别是:

  

Groovy是动态类型的   语言,但您可以静态声明变量的类型。   JVM上的泛型在编译时被擦除,只有原始类型   可用于VM(对于groovy和Java都是如此)。在   Java,有编译时检查,以确保你没有东西   int到字符串列表中。但是,Groovy不会检查类型   编译时间。

     

因此,这意味着在编译时不会检查type参数   并且在运行时不可用。

答案 1 :(得分:2)

埃里克,

我怀疑这是由类型擦除引起的,herehere。由于groovy被编译为字节代码,因此在字节代码级别删除参数化类型。因此,

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

因此它由键和对象值组成。这就是groovy代码编译和运行没有错误的原因。 希望这会有所帮助。