java.util.concurrent.ConcurrentMap' 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
。
这到底发生了什么?我编译它似乎很奇怪。
答案 0 :(得分:2)
Int
不能是null
,也不能是AnyVal
。来自scaladoc:
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
编译器使用Int
的默认值填充它,0
。
例如:
scala> def getNull[A](i: A): A = null.asInstanceOf[A]
getNull: [A](i: A)A
scala> getNull(1)
res6: Int = 0
在幕后,我们实际上无法将null
转换为Int
,但可以将其转换为盒装类型。但是,一旦我们在上下文中使用盒装类型,它应该像它包含的原语一样,它就会转换为该类型,这需要一个默认值。