给出以下代码:
class Animal
class Cat extends Animal
class BlackCat extends Cat
class MyOption[+A](val x: A) {
def get(): A = x
def getOrElse[B >: A](default: => B): B = {
if (x != null) x else default
}
}
object ThirdParty {
def getAnimal : MyOption[Animal]= new MyOption[Cat](null)
}
object MyOptionRunner {
def main(args: Array[String]) {
val opt3: Animal = ThirdParty.getAnimal.getOrElse(new BlackCat)
println(opt3)
}
}
我很惊讶val opt3: Animal = ThirdParty.getAnimal.getOrElse(new BlackCat)
可以通过编译。
ThirdParty.getAnimal
的类型是Myption [Cat],然后调用相当于
Myption[Cat].getOrElse(new BlackCat),
它不符合getOrElse的定义,A是Cat,B是BlackCat,它打破了B>:A
答案 0 :(得分:1)
val opt3: Animal = ThirdParty.getAnimal.getOrElse(new BlackCat)
B
不是BlackCat
; B
的类型将是符合所需规范的最具体类型。由于参数为new BlackCat
,我们知道B >: BlackCat
。根据{{1}}的要求,我们知道getOrElse
。满足这两个要求的最具体类型自然是B >: Cat
。