Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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 嵌套集合中选项的怪异类型擦除_Scala_Scala Collections_Type Erasure - Fatal编程技术网

Scala 嵌套集合中选项的怪异类型擦除

Scala 嵌套集合中选项的怪异类型擦除,scala,scala-collections,type-erasure,Scala,Scala Collections,Type Erasure,在嵌套集合中使用选项时,我遇到了以下奇怪的问题: val works: Array[Option[Int]] = Array(1) .map { t => Some(t)} val fails: Array[Array[Option[Int]]] = Array(Array(1)) .map { ts => ts.map { Some(_)} } // error: type mismatch; found : Array[Array[Some[Int]]] requ

在嵌套集合中使用选项时,我遇到了以下奇怪的问题:

val works: Array[Option[Int]] = Array(1)
  .map { t => Some(t)}

val fails: Array[Array[Option[Int]]] = Array(Array(1))
  .map { ts => ts.map { Some(_)} }
// error: type mismatch;  found   : Array[Array[Some[Int]]] required: Array[Array[Option[Int]]]

val worksButUgly: Array[Array[Option[Int]]] = Array(Array(1))
  .map { ts => ts.map { case t => (Some(t).asInstanceOf[Option[Int]])}}

我想在进行某种类型的擦除时可能会出现问题,但这是Scala的预期行为吗?有人知道到底发生了什么吗?

Scala中的数组是不变的。这可以防止数组在Java中遇到的一些问题,在Java中,您可以创建一个某物数组,声明它是某物超类数组,然后放入另一个子类。例如,说一排苹果就是一排水果,然后把香蕉放进去。最糟糕的是,它在运行时失败,而不是在编译时

出于这个原因,Scala决定数组应该是不变的。这意味着
Array[Apple]
不是
Array[Fruit]
的子类。(请注意,与数组不同,不可变集合通常是协变的,例如,
List
,因为不可变性阻止我们以后将香蕉放入其中)

所以是的
Some
Option
的子类,但是
Array[Some]
不是
Array[Option]
的子类。这些将起作用:

val foo1: Array[Array[Option[Int]]] = Array(Array(1))
  .map { ts => ts.map { Option(_)} }

val foo2: Array[List[Option[Int]]] = Array(List(1))
  .map { ts => ts.map { Some(_)} }

Scala中的数组是不变的。这可以防止数组在Java中遇到的一些问题,在Java中,您可以创建一个某物数组,声明它是某物超类数组,然后放入另一个子类。例如,说一排苹果就是一排水果,然后把香蕉放进去。最糟糕的是,它在运行时失败,而不是在编译时

出于这个原因,Scala决定数组应该是不变的。这意味着
Array[Apple]
不是
Array[Fruit]
的子类。(请注意,与数组不同,不可变集合通常是协变的,例如,
List
,因为不可变性阻止我们以后将香蕉放入其中)

所以是的
Some
Option
的子类,但是
Array[Some]
不是
Array[Option]
的子类。这些措施将发挥作用:

val foo1: Array[Array[Option[Int]]] = Array(Array(1))
  .map { ts => ts.map { Option(_)} }

val foo2: Array[List[Option[Int]]] = Array(List(1))
  .map { ts => ts.map { Some(_)} }
使用
Some(t):Option[Int]
代替
Some(t)。a替代[Option[Int]]
。它既短又安全:如果类型不匹配,它将无法编译。

使用
Some(t):Option[Int]
而不是
Some(t)。asInstanceOf[Option[Int]
。它既短又安全:如果类型不匹配,它将无法编译