2013-02-03 35 views
6

संकलक मुझे बता रहा है कि यह चेतावनी के साथ नहीं हो सकता है: "contravariant प्रकार ए प्रकार में covariant स्थिति में होता है>: <: किसी भी प्रकार बी" चेतावनी रचना विधि के प्रकार पैरामीटर में है। तर्कसंगत रूप से टाइप परिभाषा मुझे समझ में आता है। यदि कंपाइलर के पास कोई योग्यता नहीं है और फिर, बातचीत के साथ समस्या क्यों है?स्कैला कंपाइलर का कहना है कि contravariant प्रकार ए प्रकार में covariant स्थिति में होता है>: ए <: किसी भी प्रकार बी?

trait Foo[-A]{ 
    def compose[B >: A](t: Foo[B]): Foo[A] = t andThen this 
    def andThen[B <: A](t: Foo[B]): Foo[B] 
} 

मुझे केवल एक उदाहरण है जहां यह टूट जाता है। तब मैं खुश हूँ।

उत्तर

4

त्रुटि के अनुसार, A का आपका भिन्नता एनोटेशन गलत है। आप रिटर्न प्रकार में A का उपयोग नहीं कर सकते हैं जो एक कॉन्वर्सेट स्थिति है। कल्पना कीजिए कि आप Foo में एक और तरीका है जो उचित contravariant स्थिति में A का उपयोग करता है (एक तर्क के रूप में) था:

trait Foo[-A] { 
    ... 
    def foo(a: A): Unit 
} 

अब आप देख सकते हैं कि यह कैसे दुर्घटनाओं:

  • Foo[-A] का तात्पर्य है कि Foo[X] <: Foo[Y] अगर X >: Y
  • एक लौटाया गया मूल्य घोषित रिटर्न प्रकार
  • का सबटाइप हो सकता है, इसलिए -A यहां कानूनी था, compose के लिए कुछ A1 >: A
  • कहना trait X एक Foo[A1] वापस कर सकती है और trait Y extends X { def bar() }
  • कल्पना एक Foo[Y] जहां foo कॉल a.bar()
  • फलस्वरूप यह टूट जाएगा अगर compose आप के लिए उदाहरण के लिए Foo[X]

तो वापस जाने के लिए अनुमति दी गई थी संकलन, A invariant होना चाहिए।