【问题标题】:Scala covariance with lower bound具有下限的 Scala 协方差
【发布时间】:2014-06-07 20:27:53
【问题描述】:

我正在看行动书中的 scala,它有这个代码

sealed abstract class Maybe[+A] {
    def isEmpty: Boolean
    def get: A
    def getOrElse[B >: A](default: B): B = {
        if(isEmpty) default else get
    }
}
    final case class Just[A](value: A) extends Maybe[A] {
    def isEmpty = false
    def get = value
}
case object Nil extends Maybe[scala.Nothing] {
    def isEmpty = true
    def get = throw new NoSuchElementException("Nil.get")
}

如果 getOrElse 的签名定义为 def getOrElse(默认值:A):A = 它没有编译。

作者说 "下界 B>: A 声明类型参数 B 被约束为类型 A 的某个超类型"

但我似乎能够做到这一点并且它有效

val j1 = Just(1)                                  
val l1 = j1.getOrElse("fdsf")  //l1  : Any = 1

String 是 Int 的超类型吗?我不明白为什么会这样?就像它回退到参数 1 是类型 A 是 Any 类型(它是)而不是 Int 类型。

【问题讨论】:

    标签: scala


    【解决方案1】:

    在 Scala 中,方法参数中不能有协变类型。

    这是因为在方法参数中允许协变类型会破坏类型安全。

    为了拥有协变类型,您必须使用有界类型:

    getOrElse[B >: A](default: B): B
    

    这表示找到某种类型,B,它是A 的超类,并成为方法返回类型。

    在您的情况下,AInt,而您传入​​了 String。作为IntString 的超类的唯一类型BAny

    在这种情况下,B 变为 Any,因此该方法返回 Any

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 2016-10-16
      • 2020-03-29
      • 2012-06-29
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多