2011-03-15 18 views
6

कैसे Seq [+ A] एक में covariant जा सकता है अगर एक contravariant स्थिति में होता है:सीक [+ ए] ए में कैसे हो सकता है?

def :+ (elem: A) : Seq[A] ?

मैं समझता हूँ के रूप में, एक विधि तर्क प्रकार एक contravariant स्थिति है। मैं क्या खो रहा हूँ ?

उत्तर

10

यह उपयोग हस्ताक्षर का उपयोग करें। यह वास्तविक हस्ताक्षर नहीं है, केवल सामान्य उपयोग मामले में आप आमतौर पर क्या देखेंगे।

वास्तविक हस्ताक्षर है:

def :+ [B >: A, That] (elem : B)(implicit bf : CanBuildFrom[Seq[A], B, That]) : That 

कौन सा, जैसा कि आप देख, यहां तक ​​कि एक Seq वापसी, बहुत कम A गारंटी नहीं है।

+5

डैनियल ने जो कहा, उस पर निर्माण करने के लिए, संग्रह विधियां _a नया संग्रह_ लौटाती हैं और इनमें विस्तृत प्रकार हो सकता है। तो, हां, एक 'सेक [ए]' में केवल 'ए' हो सकता है, लेकिन आपका नया 'सीईसी' इसके प्रकार को बढ़ा सकता है ताकि इसमें केवल 'ए' से अधिक हो। –

+3

यह एक शर्म की बात है कि उपयोग केस हस्ताक्षर ': + (elem: ए): सेक [ए] 'के बजाय': + [बी>: ए] (elem: B): Seq [B] '' । –

+0

@ क्रिस I concur: ': + [बी>: ए] (elem: बी): सेक [बी]' अधिक सहज ज्ञान युक्त है। क्या हम स्काला लोगों से एपीआई दस्तावेज़ बदलने के लिए कह सकते हैं? – Michael

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