スカラでは、未来は共変であると定義されていますが、プロミスは不変です。プロミスはほとんど反禁制になると言われています(https://issues.scala-lang.org/browse/SI-7467)。これはなぜですか?なぜプロミスは共変できないのですか
答えて
約束はあなたが行うことができるだろう共変していた場合:
val p: Promise[Any] = Promise[String]()
p.success(1)
は、それによって安全ではないだろうInt
とPromise[String]
を完了する。
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]
です。
ここでは、可変性は問題ありません。私は、「約束」は反禁忌にすることができると思う。 – ZhekaKozlov
@ ZhekaKozlovそれは確かに共分散の問題です。それは質問が求めていることです。 –
共分散については問題ですが、**分散については** – ZhekaKozlov
- 1. JSでプロミスが必要なのはなぜですか
- 2. イメージを共有できないのはなぜですか?
- 3. メンバー変数を共有できないのはなぜですか?
- 4. プロミスから未定義になるのはなぜですか? -
- 5. プロミスが構文エラーをキャプチャするのはなぜですか?
- 6. Facebookでこのビデオを共有できないのはなぜですか?
- 7. インタフェースIOrderedEnumerable <T>がTで共変しないのはなぜですか?
- 8. 共有サーバーでnode.jsを使用できないのはなぜですか?
- 9. shinyapps.ioでShinyAppを共有できないのはなぜですか?
- 10. node.jsを共有ホスティングで実行できないのはなぜですか?
- 11. Javaオプションは変更できないのはなぜですか?
- 12. FacebookがFirebaseストレージイメージファイルを共有できないのはなぜですか?
- 13. インデックス値を変更できないのはなぜですか?
- 14. 「これ」を変更できないのはなぜですか?
- 15. ディレクトリを変更できないのはなぜですか?
- 16. JSキャンバスイメージを変換できないのはなぜですか?
- 17. pd.to_datetimeが変換できないのはなぜですか?
- 18. なぜLINQはstring.IsNullOrWhiteSpace()を変換できないのですか?
- 19. ViewControllerを変更できないのはなぜですか?
- 20. OpenMPでクラスメンバー変数xを共有(x)できないのはなぜですか?メンバ関数で
- 21. Javaメソッドのオーバーライドで、共変な戻り値型を持つことができますが、共変量のパラメータを持てないのはなぜですか?
- 22. 共通変数をプライベートまたはパブリックに設定できないのはなぜですか?
- 23. JLabelで変数を変更できないのはなぜですか?
- 24. kivyアニメーションで変数を変更できないのはなぜですか?
- 25. なぜpythonでディレクトリを変更できないのですか?
- 26. なぜ配列は不変ですが、リストは共変型ですか?
- 27. なぜSO_RCVBUFの値を変更できないのですか?
- 28. CSSの変数 - なぜ使用できないのですか?
- 29. コードバでグローバルなJS変数にアクセスできないのはなぜですか?
- 30. なぜ文字セットを変更できないのですか?
単純なルールがあります。値を取得できれば、それは共変(Try、Future、List、Vector、Option、...)です。あなたがそれに価値を置くことができれば、これは禁忌です(約束、注文、消費者、...)。 – ZhekaKozlov