2017-03-13 14 views
6

स्कैला में, भविष्य को परिभाषित करने के लिए परिभाषित किया गया है जबकि एक वादा परिवर्तनीय है। ऐसा कहा जाता है कि एक वादा लगभग contravariant (https://issues.scala-lang.org/browse/SI-7467) किया जा सकता है। यह एक केस क्यों है?क्यों वादा नहीं किया जा सकता

+0

एक साधारण नियम है: यदि आप इसका मूल्य प्राप्त कर सकते हैं, तो यह कॉन्वेंट (कोशिश, भविष्य, सूची, वेक्टर, विकल्प, ...) है। यदि आप इसमें कोई मूल्य डाल सकते हैं, तो यह contravariant (वादा, आदेश, उपभोक्ता, ...) है। – ZhekaKozlov

उत्तर

7

तो वादा covariant रहे थे तुम क्या करने में सक्षम हो जाएगा:

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

जिससे एक Int जो असुरक्षित हो जाएगा के साथ एक Promise[String] को पूरा करने।

1

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] के साथ।

+1

उत्परिवर्तन यहां भिन्नता के लिए कोई समस्या नहीं है। मुझे लगता है कि 'वादा' को contravariant बनाया जा सकता है। – ZhekaKozlov

+0

@ZhekaKozlov यह निश्चित रूप से कॉन्वर्सिस के लिए एक समस्या है, जो सवाल पूछ रहा है। –

+0

यह covariance के लिए एक समस्या है, लेकिन ** भिन्नता ** – ZhekaKozlov

संबंधित मुद्दे