1
考慮下面的代碼工作:下界似乎不是協方差
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 [貓],則該呼叫相當於 Myption[Cat].getOrElse(new BlackCat),
它不符合getOrElse的定義,A是貓和B是黑貓這裏,打破B>:甲
謝謝@ silvio-mayolo。然後,任何(任何類型的)可以是'getOrElse'的參數,例如:'ThirdParty.getAnimal.getOrElse(1)' – Tom
沒錯。 'ThirdParty.getAnimal.getOrElse(1)'將返回一個類型爲「Any」的參數。我只是親自測試過它;它的工作原理就像你說的。 –