Generics上的Groovy地图和Java地图

Eri*_*ric 9 java groovy

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

我知道我能做到:

def map = [key:"value"]

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

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

此代码编译,但映射实际上不是String-> String映射:

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

它打印:

1:1 [类java.lang.Integer]

2:2 [类java.lang.String]

任何人都可以帮助我理解如何使用String-> String显式键入地图可以将字符串分配给包含String-> 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>

这个解释现在很有意义.

Igo*_*gor 8

这个论坛帖子谈论Groovy忽略泛型,特别是:

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

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

  • 谢谢@GrailsGuy,帖子提到了TypeChecked注释,这非常有趣. (2认同)