在交互式scala控制台中运行以下代码
val map = new java.util.HashMap[String, Integer]();
map.put("key1", 5)
"Test " + map.get("key1") + " " + map.get() + " " + map.get("key1", "key2") + " " + map.get("key1", "key2", "key3")
返回以下内容
Test 5 null null null
我希望这个代码在第一次调用之外的所有调用中都会导致编译器错误,该错误是关于get方法调用中的错误参数数量。为什么这个成功编译并且只返回null?
答案 0 :(得分:12)
Java映射不是类型安全的,特别是get
方法具有此签名:
public V get(Object key);
所以你可以用任何东西作为钥匙。在Scala中,您会看到所谓的自动翻译,这在Scala 2.11中已被弃用,因此如果使用-deprecation
编译项目,您将看到:
[warn] ... Adaptation of argument list by inserting () has been deprecated: leaky (Object-receiving) target makes this especially dangerous.
[warn] signature: HashMap.get(x$1: Any): V
[warn] given arguments: <none>
[warn] after adaptation: HashMap.get((): Unit)
[warn] "Test " + map.get("key1") + " " + map.get() + " " + map.get("key1", "key2") + " " + map.get("key1", "key2", "key3")
[warn] ^
您可以使用-Xfuture
编译器标志将其转换为错误:
[error] ... Adaptation of argument list by inserting () has been removed.
[error] signature: HashMap.get(x$1: Any): V
[error] given arguments: <none>
[error] "Test " + map.get("key1") + " " + map.get() + " " + map.get("key1", "key2") + " " + map.get("key1", "key2", "key3")
[error] ^
自动归档意味着map.get()
将被视为map.get(())
,而map.get("key1", "key2")
将被视为map.get(("key1", "key2"))
。
我建议使用Scala自己的集合类型,除非您有非特别的理由不这样做。