Dado el siguiente código:
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)
}
}
Me sorprende que val opt3: Animal = ThirdParty.getAnimal.getOrElse(new BlackCat)
pueda pasar la compilación.
El tipo de ThirdParty.getAnimal
es Myption [Cat], entonces la llamada es equivalente a Myption[Cat].getOrElse(new BlackCat),
que no se ajusta a la definición de getOrElse, A es Cat y B es BlackCat aquí, que rompe B>: A
val opt3: Animal = ThirdParty.getAnimal.getOrElse(new BlackCat)
B
no es BlackCat
; el tipo de B
será el tipo más específico que se ajuste a la especificación requerida. Dado que el argumento es new BlackCat
, lo sabemos B >: BlackCat
. Por el requisito de getOrElse
, lo sabemos B >: Cat
. El tipo más específico que satisfaga tanto de estos requisitos es, naturalmente, Cat
.
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras