9

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

我知道我可以做到:

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>

这个解释现在完全有道理。

4

2 回答 2

9

这篇论坛帖子讨论了 Groovy 忽略泛型,特别是:

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

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

于 2013-04-02T03:05:33.907 回答
4

埃里克,

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

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

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

于 2013-04-02T03:04:37.263 回答