【问题标题】:Groovy map and Java map on Generics泛型上的 Groovy 映射和 Java 映射
【发布时间】:2013-04-02 02:49:42
【问题描述】:

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

我知道我能做到:

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]

谁能帮我理解一个用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>

这个解释现在很有意义。

【问题讨论】:

    标签: java groovy


    【解决方案1】:

    forum post 谈到 Groovy 忽略泛型,具体来说:

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

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

    【讨论】:

    • hmm...那么在 groovy 中允许泛型语法有什么意义呢?
    • @zhong.j.yu 让编译器语法检查器保持高效。很少执行类型强制,尤其是在编译时。 Groovy 在类型强制方面非常松散,并广泛使用 Object 类型
    • 如果编译器根本不支持泛型会不会更开心?
    • 谢谢@GrailsGuy,帖子里提到了TypeChecked注解,很有意思。
    【解决方案2】:

    埃里克,

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多