स्कैला में, भविष्य को परिभाषित करने के लिए परिभाषित किया गया है जबकि एक वादा परिवर्तनीय है। ऐसा कहा जाता है कि एक वादा लगभग contravariant (https://issues.scala-lang.org/browse/SI-7467) किया जा सकता है। यह एक केस क्यों है?क्यों वादा नहीं किया जा सकता
उत्तर
तो वादा covariant रहे थे तुम क्या करने में सक्षम हो जाएगा:
val p: Promise[Any] = Promise[String]()
p.success(1)
जिससे एक Int
जो असुरक्षित हो जाएगा के साथ एक Promise[String]
को पूरा करने।
ए Promise
एक परिवर्तनीय एपीआई है, जो कॉन्वर्सिस के साथ अच्छी तरह से किराया नहीं करता है। Future
एस इस समस्या का सामना नहीं करते हैं क्योंकि आप उन्हें Promise
के साथ मैन्युअल रूप से पूरा नहीं कर सकते हैं। आप चाहते हैं Promise[A]
A
से अधिक covariant किया जाना है, इसका मतलब है कि हम चाहते हैं Promise[Cat] <: Promise[Animal]
और Promise[Dog] <: Promise[Animal]
तो
class Animal
class Cat extends Animal
class Dog extends Animal
:
मान लीजिए कि हम करते हैं। मान लीजिए कि हम यह कर सकते हैं।
ठीक है, तो मान लीजिए कि हम एक Promise[Cat]
डालते हैं:
val p: Promise[Cat] = ...
हमारे अनुमान से, यह भी एक Promise[Animal]
है:
val q: Promise[Animal] = p
Promise
एक विधि complete
कहा जाता है जो एक Try[T]
स्वीकार करता है, जो है भी सहकारी। इसका मतलब है कि Try[Dog]
भी Try[Animal]
है। देखें कि यह कहां अग्रणी है?
हम कॉल करने के लिए सक्षम होगा: क्योंकि हम एक Try[Animal]
के साथ एक Promise[Animal]
पूरा करने के लिए उफ़ कोशिश कर रहे हैं, लेकिन ,
val value: Try[Dog] = ...
q.complete(value)
कौन सा कानूनी हो सकता है, हम भी सिर्फ एक Promise[Cat]
को पूरा करने की कोशिश की Promise[Dog]
के साथ।
उत्परिवर्तन यहां भिन्नता के लिए कोई समस्या नहीं है। मुझे लगता है कि 'वादा' को contravariant बनाया जा सकता है। – ZhekaKozlov
@ZhekaKozlov यह निश्चित रूप से कॉन्वर्सिस के लिए एक समस्या है, जो सवाल पूछ रहा है। –
यह covariance के लिए एक समस्या है, लेकिन ** भिन्नता ** – ZhekaKozlov
- 1. क्यों हाइबरनेट STRING को हल नहीं किया जा सकता है?
- 2. क्यों structs सीधे असाइन नहीं किया जा सकता है?
- 3. क्यों jspService() को ओवरराइड नहीं किया जा सकता है?
- 4. क्यों नलिकाओं को घोषित घोषित नहीं किया जा सकता है?
- 5. लैम्बडा अभिव्यक्ति में क्यों प्रिंट नहीं किया जा सकता है?
- 6. Base64Encoder को हल नहीं किया जा सकता
- 7. ऑपरेटर && लागू नहीं किया जा सकता है
- 8. वर्ग स्थापित नहीं किया जा सकता
- 9. R.layout.main को हल नहीं किया जा सकता
- 10. EF7 और GroupBy() नहीं किया जा सकता
- 11. org.json.simple को हल नहीं किया जा सकता
- 12. CURLOPT_FOLLOWLOCATION सक्रिय नहीं किया जा सकता
- 13. विधि 'XYZ' परिलक्षित नहीं किया जा सकता
- 14. setLatestEventInfo को हल नहीं किया जा सकता
- 15. मेमोरी आवंटित नहीं किया जा सकता
- 16. @JavascriptInterface को हल नहीं किया जा सकता
- 17. "ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass" को एम्बेड नहीं किया जा सकता
- 18. Automapper.Mapper.CreateMap को हल नहीं किया जा सकता
- 19. क्यों pervasives.cmi खोला नहीं जा सकता है?
- 20. कोणीय सामग्री डिजाइन में एक संवाद पॉपअप द्वारा एक वादा कैसे किया जा सकता है?
- 21. पहुंचा नहीं जा सकता वस्तुओं कचरा एकत्र नहीं किया जा सकता
- 22. Cpython में क्या किया जा सकता है जो IronPython में नहीं किया जा सकता है?
- 23. पता नहीं लगाया जा सकता है कि सबनेट को क्यों अपडेट किया जा रहा है
- 24. एक गैर-पीओडी ऑब्जेक्ट से एक std :: वादा किया जा सकता है?
- 25. ऑपरेशन पूरा नहीं किया जा सकता है क्योंकि DbContext को
- 26. चर आकार वस्तु आरंभ नहीं किया जा सकता है
- 27. तत्काल खिड़की, "अभिव्यक्ति का मूल्यांकन नहीं किया जा सकता है ...."
- 28. "वेरिएबल उदाहरण प्रारंभ नहीं किया जा सकता है" अज्ञात वर्ग
- 29. कुकीज़ आईई में सेट नहीं किया जा सकता है?
- 30. आर को हल नहीं किया जा सकता है - एंड्रॉइड त्रुटि
एक साधारण नियम है: यदि आप इसका मूल्य प्राप्त कर सकते हैं, तो यह कॉन्वेंट (कोशिश, भविष्य, सूची, वेक्टर, विकल्प, ...) है। यदि आप इसमें कोई मूल्य डाल सकते हैं, तो यह contravariant (वादा, आदेश, उपभोक्ता, ...) है। – ZhekaKozlov