繁体   English   中英

下界的Scala协方差

[英]Scala covariance with lower bound

我正在看动作书中的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

字符串是Int的超类型吗? 我为什么不知道为什么呢? 就像回到参数1一样,类型A的类型为Any(它是)而不是Int类型。

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

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

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

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

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

在您的情况下, AInt并且您传入String 作为IntString的超类的唯一类型BAny

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM