我在scala repl中玩,发现了这个:
scala> new java.util.HashMap[Long, Long]().get(1L)
res2: Long = 0
为什么会回归呢? Java哈希映射应该为缺失的密钥返回null。
答案 0 :(得分:4)
找到机制并不太难。
scala> new java.util.HashMap[Long, Long]().get(1L)
res0: Long = 0
scala> :javap -prv -
Binary file res0 contains $line3.$read$$iw$$iw$
[snip]
17: invokestatic #30 // Method scala/runtime/BoxesRunTime.boxToLong:(J)Ljava/lang/Long;
20: invokevirtual #34 // Method java/util/HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;
23: invokestatic #38 // Method scala/runtime/BoxesRunTime.unboxToLong:(Ljava/lang/Object;)J
和
public static long unboxToLong(Object l) {
return l == null ? 0 : ((java.lang.Long)l).longValue();
}
答案 1 :(得分:3)
你应该,
它不能像在Scala中那样工作。来自scala.Null documentation -
由于Null不是值类型的子类型,因此null不是任何此类型的成员。例如,无法将null赋给scala.Int类型的变量。
答案 2 :(得分:3)
在Scala中,Long
是AnyVal
,因此它不能为空。