一些[Seq [X]]不符合预期的类型选项[Seq [X]]

时间:2017-05-20 00:34:32

标签: scala

我是Scala的新手,我收到编译时错误:

  

某些[Seq [String]]类型的表达式不符合预期类型选项[Seq [String]]

这是代码中的一行

val enabledCipherSuites : Option[scala.collection.immutable.Seq[String]] = Some(Seq("TLS_RSA_WITH_AES_256_CBC_SHA"))

我查看了Option类源代码,但无法弄清楚为什么某些序列不是序列选项。

让我知道原因。感谢

编辑1:我需要在代码

中明确指定我的序列是不可变的

1 个答案:

答案 0 :(得分:5)

这是因为您导入的默认Seq实际上是其他内容,即scala.collection.Seq。这在scala.Predef中定义,标准导入集:

type Seq[+A] = scala.collection.Seq[A]
val Seq = scala.collection.Seq

现在Option的默认方差可以反过来。

val enabledCipherSuites : Option[Seq[String]] = Some(scala.collection.immutable.Seq("TLS_RSA_WITH_AES_256_CBC_SHA"))

这是因为scala.collection.immutable.Seq扩展了scala.collection.Seq,但显然不是相反。第一种方案有效,因为Option在其类型参数中是协变的,因此您对任何B <: AOption[B]都是Option[A]的子类型。

你的情况正好相反,你有immutable.Seq[A] <:< collection.Seq[A],但你期望Option[collection.Seq[A]]成为Option[immutable.Seq[A]]的子类型,这不是真的,只有相反的情况才是真的。

Predef导入与方差相结合是造成混淆的原因。