2017-03-13 10 views
6

スカラでは、未来は共変であると定義されていますが、プロミスは不変です。プロミスはほとんど反禁制になると言われています(https://issues.scala-lang.org/browse/SI-7467)。これはなぜですか?なぜプロミスは共変できないのですか

+0

単純なルールがあります。値を取得できれば、それは共変(Try、Future、List、Vector、Option、...)です。あなたがそれに価値を置くことができれば、これは禁忌です(約束、注文、消費者、...)。 – ZhekaKozlov

答えて

7

約束はあなたが行うことができるだろう共変していた場合:

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

は、それによって安全ではないだろうIntPromise[String]を完了する。

1

Promiseは、共分散ではうまくいかない可変APIです。 Futureは、Promiseのように手動で完了できないため、この問題は発生しません。

のは、我々が持っているとしましょう:

class Animal 
class Cat extends Animal 
class Dog extends Animal 

をあなたは私たちがPromise[Cat] <: Promise[Animal]Promise[Dog] <: Promise[Animal]をしたいということ、Promise[A]A上で共変したい場合。これを行うことができるとしましょう。

わかりましたので、我々はPromise[Cat]を持っているとしましょう:

val p: Promise[Cat] = ... 

私たちの推測では、それはまたPromise[Animal]です:

val q: Promise[Animal] = p 

Promiseがある、Try[T]を受け入れcompleteというメソッドを持っています共変もある。つまり、Try[Dog]Try[Animal]です。これが主導しているところを見てください。

我々は呼び出すことができると思います:

法的だろう
val value: Try[Dog] = ... 

q.complete(value) 

、我々はTry[Animal]Promise[Animal]を完了しようとしているが、おっとしているので、我々はまた、単にPromise[Cat]を完了しようとしましたPromise[Dog]です。

+1

ここでは、可変性は問題ありません。私は、「約束」は反禁忌にすることができると思う。 – ZhekaKozlov

+0

@ ZhekaKozlovそれは確かに共分散の問題です。それは質問が求めていることです。 –

+0

共分散については問題ですが、**分散については** – ZhekaKozlov

関連する問題