嵌套集合中Option的奇怪类型擦除

时间:2017-01-24 10:40:08

标签: scala scala-collections type-erasure

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

INSERT INTO jnct_students_topics (topic_id_FK)
SELECT topic_id 
FROM topics  

我想这可能是沿途某种类型擦除的问题,但这是Scala中的预期行为吗?有谁知道究竟发生了什么?

2 个答案:

答案 0 :(得分:5)

Scala中的数组是不变的。这可以防止阵列中存在的一些问题。 Java,你可以创建一个东西的数组,宣称它是一个超类的数组,然后放入另一个子类。例如,说一个苹果数组是一个水果数组,然后把香蕉放进去。最糟糕的是,它在运行时失败,而不是在编译时失败。

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

是的。 SomeOption的子类,但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(_)} }

答案 1 :(得分:0)

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