Scala 为什么在从Java进行转换时可以将null存储在Int中,而不是其他形式?
在下面的代码中,我创建了一个Java集合。稍后,当我将其转换为Scala时,我可以将Scala 为什么在从Java进行转换时可以将null存储在Int中,而不是其他形式?,scala,Scala,在下面的代码中,我创建了一个Java集合。稍后,当我将其转换为Scala时,我可以将null存储在Int中。但是如果我直接创建一个scala映射,我就不能存储null。为什么? scala> import collection.JavaConverters._ import collection.JavaConverters._ scala> val mapJava:java.util.HashMap[String,java.lang.Integer] = new java.ut
null
存储在Int
中。但是如果我直接创建一个scala映射,我就不能存储null
。为什么?
scala> import collection.JavaConverters._
import collection.JavaConverters._
scala> val mapJava:java.util.HashMap[String,java.lang.Integer] = new java.util.HashMap[String,java.lang.Integer]
mapJava: java.util.HashMap[String,Integer] = {}
scala> mapJava.put("key",null)
res2: Integer = null
scala> println(mapJava)
{key=null}
scala> val mapScala = mapJava.asScala
mapScala: scala.collection.mutable.Map[String,Integer] = Map(key -> null)
scala> val mapScalaI = mapScala.asInstanceOf[scala.collection.Map[String,Int]]
mapScalaI: scala.collection.Map[String,Int] = Map(key -> null) //storing null in Int
//but I cannot store null in Int in following code. why?
scala> val mapScalaI2 = Map[String,Int]("key"->null)
<console>:14: error: an expression of type Null is ineligible for implicit conversion
val mapScalaI2 = Map[String,Int]("key"->null)
^
scala>import collection.JavaConverters_
导入collection.JavaConverters_
scala>val mapJava:java.util.HashMap[String,java.lang.Integer]=新的java.util.HashMap[String,java.lang.Integer]
mapJava:java.util.HashMap[String,Integer]={}
scala>mapJava.put(“key”,null)
res2:Integer=null
scala>println(mapJava)
{key=null}
scala>val-mapScala=mapJava.asScala
mapScala:scala.collection.mutable.Map[String,Integer]=Map(key->null)
scala>val-mapScalaI=mapScala.asInstanceOf[scala.collection.Map[String,Int]]
mapScalaI:scala.collection.Map[String,Int]=Map(key->null)//在Int中存储null
//但我不能在下面的代码中将null存储在Int中。为什么?
scala>val-mapScalaI2=Map[String,Int](“键”->null)
:14:错误:Null类型的表达式不适合进行隐式转换
val mapScalaI2=Map[String,Int](“键”->null)
^
在Javanull
中可以是任何引用类型的值,例如Java.lang.Integer
在Scala中,null
属于null
类型,它是任何引用类型的子类型scala.Int
是基本类型,而不是引用类型
。。。
scala>val-mapScala=mapJava.asScala
mapScala:scala.collection.mutable.Map[String,Integer]=Map(key->null)
scala>val-mapScalaI=mapScala.asInstanceOf[scala.collection.Map[String,Int]]
mapScalaI:scala.collection.Map[String,Int]=Map(key->null)//在Int中存储null
...
理论上,mapScala.asInstanceOf[scala.collection.Map[String,Int]]
应该失败,因为Integer
类型参数与Int
类型参数不同。但是,它实际上没有这样做,因为由于Java类型擦除,asInstanceOf
没有(或不能)检查Map[String,Int]
的类型参数。发件人:
请注意,运行时强制转换的成功在于modulo Scala的擦除语义。因此,表达式1.asInstanceOf[String]
将在运行时抛出ClassCastException
,而表达式List(1).asInstanceOf[List[String]
将不会。在后一个示例中,由于类型参数作为编译的一部分被删除,因此无法检查列表的内容是否属于请求的类型
这并不能解释为什么
mapScala
对于key
-scala.collection.mutable.Map[String,Integer]=Map(key->null)