[英]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
的超类并成为方法返回类型。
在您的情况下, A
为Int
并且您传入String
。 作为Int
和String
的超类的唯一类型B
是Any
。
在这种情况下B
变为Any
因此该方法返回Any
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.