我是Scala的新手,我收到编译时错误:
某些[Seq [String]]类型的表达式不符合预期类型选项[Seq [String]]
这是代码中的一行
val enabledCipherSuites : Option[scala.collection.immutable.Seq[String]] = Some(Seq("TLS_RSA_WITH_AES_256_CBC_SHA"))
我查看了Option类源代码,但无法弄清楚为什么某些序列不是序列选项。
让我知道原因。感谢
编辑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 <: A
,Option[B]
都是Option[A]
的子类型。
你的情况正好相反,你有immutable.Seq[A] <:< collection.Seq[A]
,但你期望Option[collection.Seq[A]]
成为Option[immutable.Seq[A]]
的子类型,这不是真的,只有相反的情况才是真的。
Predef导入与方差相结合是造成混淆的原因。