我是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:我需要在代码中稍后明确指定我的序列是不可变的
这是因为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导入与方差相结合是造成混淆的原因.