Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么在从Java进行转换时可以将null存储在Int中,而不是其他形式?_Scala - Fatal编程技术网

Scala 为什么在从Java进行转换时可以将null存储在Int中,而不是其他形式?

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

在下面的代码中,我创建了一个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.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)
^

在Java
null
中可以是任何引用类型的值,例如
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)