为什么从java.util.HashMap[Long,Long]中获取缺少的密钥会返回0L?

为什么从java.util.HashMap[Long,Long]中获取缺少的密钥会返回0L?,java,scala,hashmap,Java,Scala,Hashmap,我在scala repl中玩时发现: scala> new java.util.HashMap[Long, Long]().get(1L) res2: Long = 0 为什么它会返回那个?Java哈希映射应该为缺少的键返回null。您应该: 使用,或 检查密钥是否与您使用Java时应该使用的相同 在Scale中,它不能像scala.Null中那样工作- 由于Null不是值类型的子类型,因此Null不是任何此类类型的成员。例如,不可能将null赋值给scala.Int类型的变量 在Sca

我在scala repl中玩时发现:

scala> new java.util.HashMap[Long, Long]().get(1L)
res2: Long = 0
为什么它会返回那个?Java哈希映射应该为缺少的键返回null。

您应该:

  • 使用,或
  • 检查密钥是否与您使用Java时应该使用的相同
  • 在Scale中,它不能像scala.Null中那样工作-

    由于Null不是值类型的子类型,因此Null不是任何此类类型的成员。例如,不可能将null赋值给scala.Int类型的变量


    在Scala中,
    Long
    是一个
    AnyVal
    ,因此不能为空

    找到机制并不难

    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
    


    我知道如何在真实的代码中处理它们,我只是更想知道是什么机制在起作用。但是,不可能将null赋值给Scala中的变量。
    public static long unboxToLong(Object l) {
        return l == null ? 0 : ((java.lang.Long)l).longValue();
    }