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

sdi*_*h94 0 scala

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

Some [Seq [String]]类型的表达式不符合预期类型Option [Seq [String]]

这是代码中的一行

val enabledCipherSuites : Option[scala.collection.immutable.Seq[String]] = Some(Seq("TLS_RSA_WITH_AES_256_CBC_SHA"))
Run Code Online (Sandbox Code Playgroud)

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

让我知道为什么.谢谢

编辑1:我需要在代码中稍后明确指定我的序列是不可变的

fla*_*ian 5

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

type Seq[+A] = scala.collection.Seq[A]
val Seq = scala.collection.Seq
Run Code Online (Sandbox Code Playgroud)

现在,默认方差Option将相反.

val enabledCipherSuites : Option[Seq[String]] = Some(scala.collection.immutable.Seq("TLS_RSA_WITH_AES_256_CBC_SHA"))
Run Code Online (Sandbox Code Playgroud)

这是因为scala.collection.immutable.Seq延伸scala.collection.Seq,但显然不是相反的方式.第一种方案可行的,因为Option在它的类型参数协变,因此你的任何B <: A,Option[B]是一个亚型Option[A].

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

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