【问题标题】:Some[Seq[X]] does not conform to the expected type Option[Seq[X]]Some[Seq[X]] 不符合预期的类型 Option[Seq[X]]
【发布时间】:2017-05-20 00:34:31
【问题描述】:

我是 Scala 新手,但出现编译时错误:

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

这是代码中的这一行

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

我查看了 Option 类源代码,但无法弄清楚为什么 Some of a sequence 不是 Option of Sequence。

让我知道为什么。谢谢

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    这是因为您要导入的默认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 导入与方差相结合是造成混淆的原因。

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 2019-11-22
      • 2021-08-31
      相关资源
      最近更新 更多