2014-06-07 53 views
2

我期待在行动书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的签名被定义为 高清getOrElse(默认:A):A = 它不编译。

笔者状态 “下界B>:一个声明的类型参数B被限制在一些超级型A型”

然而,我似乎能够做到这一点,它的工作原理

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

是String超类型的Int?我不明白为什么这会起作用?它就像它回落到参数1是类型为Any的类型(它是)而不是类型Int。

回答

3

在Scala中,您不能在方法参数中使用协变类型。

这是因为允许方法参数中的协变类型打破了类型安全性。

为了让你必须使用有限制类型协变类型:

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

这是说找一些类型,B,使得它的A超类,并且成为该方法的返回类型。

在你的情况下,AInt,你通过String。作为IntString的超类的唯一类型BAny

在这种情况下B变成Any所以该方法返回Any