ConcurrentMap#putIfAbsent与Scala Int';s

ConcurrentMap#putIfAbsent与Scala Int';s,scala,concurrenthashmap,Scala,Concurrenthashmap,的putIfAbsent文档对退货类型作了如下说明: 与指定键关联的上一个值,如果该键没有映射,则为null 在Scala 2.10.4上,我尝试调用putIfAbsent(Int,Int),即使用Scala的Int类型 scala> import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap scala> new ConcurrentHashMap[Int,

putIfAbsent
文档对退货类型作了如下说明:

与指定键关联的上一个值,如果该键没有映射,则为null

在Scala 2.10.4上,我尝试调用
putIfAbsent(Int,Int)
,即使用Scala的
Int
类型

scala> import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.ConcurrentHashMap

scala> new ConcurrentHashMap[Int, Int]()
res0: java.util.concurrent.ConcurrentHashMap[Int,Int] = {}

scala> val x: Int = 1
x: Int = 1
由于
1
在空的
ConcurrentHashMap
中不存在,我希望
null
putIfAbsent(x,x)
调用返回

scala> res0.putIfAbsent(x, x)
res1: Int = 0
但是,
0
返回。我假设
null
转换为
0


这到底是怎么回事?对我来说,它正在编译似乎很奇怪。

Int
不能是
null
,也不能是任何
AnyVal
。从:

Null是所有引用类型的子类型;它的唯一实例是空引用。由于Null不是值类型的子类型,因此Null不是任何此类类型的成员。例如,不可能将null赋值给scala.Int类型的变量

如果我们直接尝试,将得到一个错误:

scala> val i: AnyVal = null
<console>:9: error: type mismatch;
 found   : Null(null)
 required: AnyVal
Note that implicit conversions are not applicable because they are ambiguous:
 both method RichException in object Predef of type (self: Throwable)RichException
 and method augmentString in object Predef of type (x: String)scala.collection.immutable.StringOps
 are possible conversion functions from Null(null) to AnyVal
       val i: AnyVal = null

在幕后,我们实际上无法将
null
强制转换为
Int
,但可以将其强制转换为装箱类型。但是,一旦我们在一个上下文中使用装箱类型,它应该与它所包含的原语相似,它就会转换为该类型,这需要一个默认值。

感谢您提供了这个详细的答案。您解释了Scala
Int
如何不能
null
。给定Scala方法:
def(x:Int):java.lang.Integer
和java方法
publicstaticintg
,则
f(g)
永远不会返回
null
java.lang.Integer
是一个类,因此它可以是
null
。是的,它是这样的。抱歉耽搁了。谢谢你对我所有问题的帮助。
scala> def getNull[A](i: A): A = null.asInstanceOf[A]
getNull: [A](i: A)A

scala> getNull(1)
res6: Int = 0