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
,但可以将其强制转换为装箱类型。但是,一旦我们在一个上下文中使用装箱类型,它应该与它所包含的原语相似,它就会转换为该类型,这需要一个默认值。感谢您提供了这个详细的答案。您解释了ScalaInt
如何不能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