type parameter scala types promise future covariance

scala - parameter - ¿Por qué una Promesa no puede ser covariante?



scala self type (2)

En Scala, un futuro se define como covariante, mientras que una promesa es invariable. Se dice que una Promesa casi puede contravenir ( https://issues.scala-lang.org/browse/SI-7467 ). ¿Por qué es este el caso?


Si la promesa fuera covariante, usted podría hacer:

val p: Promise[Any] = Promise[String]() p.success(1)

completando así una Promise[String] con un Int que no sería seguro.


Una Promise es una API mutable, que no funciona bien con la covarianza. Future no sufren este problema porque no puede completarlos manualmente como lo hace con una Promise .

Digamos que tenemos:

class Animal class Cat extends Animal class Dog extends Animal

Si quiere que Promise[A] sea ​​covariante sobre A , eso significa que queremos Promise[Cat] <: Promise[Animal] y Promise[Dog] <: Promise[Animal] . Supongamos que podemos hacer esto.

De acuerdo, entonces digamos que tenemos una Promise[Cat] :

val p: Promise[Cat] = ...

Por nuestra suposición, también es una Promise[Animal] :

val q: Promise[Animal] = p

Promise tiene un método llamado complete que acepta un Try[T] , que también es covariante. Esto significa que un Try[Dog] también es un Try[Animal] . ¿Ves a dónde lleva esto?

Podriamos llamar:

val value: Try[Dog] = ... q.complete(value)

Lo cual sería legal, porque estamos tratando de completar un Promise[Animal] con un Try[Animal] , pero uy , también tratamos de completar un Promise[Cat] con un Promise[Dog] .