ConcurrentMap#putIfAbsent与Scala Int的

时间:2015-02-28 15:12:54

标签: scala concurrenthashmap

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

这到底发生了什么?我编译它似乎很奇怪。

1 个答案:

答案 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,但可以将其转换为盒装类型。但是,一旦我们在上下文中使用盒装类型,它应该像它包含的原语一样,它就会转换为该类型,这需要一个默认值。