下限似乎不适用于协方差

时间:2017-08-05 01:43:05

标签: scala

给出以下代码:

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

1 个答案:

答案 0 :(得分:1)

val opt3: Animal = ThirdParty.getAnimal.getOrElse(new BlackCat)

B不是BlackCat; B的类型将是符合所需规范的最具体类型。由于参数为new BlackCat,我们知道B >: BlackCat。根据{{​​1}}的要求,我们知道getOrElse。满足这两个要求的最具体类型自然是B >: Cat