Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 下限似乎不适用于协方差_Scala - Fatal编程技术网

Scala 下限似乎不适用于协方差

Scala 下限似乎不适用于协方差,scala,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

给定以下代码:

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(新黑猫)
能够通过编译

ThirdParty.getAnimal
的类型是Myption[Cat],那么调用相当于
Myption[Cat].getOrElse(新黑猫),
它不符合getOrElse的定义,这里A是Cat,B是BlackCat,这打破了B>:A

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

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

谢谢@silvio mayolo。然后,任何东西(Any的类型)都可以是
getOrElse
的参数,例如:
ThirdParty.getAnimal.getOrElse(1)
,没错
ThirdParty.getAnimal.getOrElse(1)
将返回类型为
Any
的参数。我只是亲自测试了一下;它的工作原理和你说的一模一样。