6

संपादित करें: त्रुटि संदेश के महत्वपूर्ण भाग को इंगित करने वाले डेरेक के लिए धन्यवाद, मैं महत्वपूर्ण भाग को थोड़ा और निकालने में सक्षम था और यह मौजूदा प्रकारों के बारे में प्रतीत होता है। यदि मैं §3.2.10 समझता हूं तो भाषा संदर्भ में मूल्य पर सटीक मात्रात्मकता, तो val m: Map[x.type#S, x.type#S] forSome { val x: T }val m: Map[t#S, t#S] forSome { type t <: T with Singleton } के लिए एक शॉर्टेंड है। फिर भी नीचे दिए गए कोड में वे अलग-अलग व्यवहार करते हैं।पथ-निर्भर प्रकार पैरामीटर के साथ कार्यों को ओवरराइड करना

trait Type { 
    type S 
} 

class Concrete extends Type { 
    type S = Double 
} 

trait BaseWorks { 
    type T <: Type 
    val m: t#S forSome { type t <: T with Singleton } 
} 

class Works extends BaseWorks { 
    override type T = Concrete 
    override val m = 0.0 
} 

trait BaseError { 
    type T <: Type 
    val m: x.type#S forSome { val x: T } 
} 

class Error extends BaseError { 
    override type T = Concrete 
    override val m = 0.0 
} 

BaseWorks काम करता है शोधन, जबकि परिष्कृत करने BaseError त्रुटि error: overriding value m in trait BaseError of type Error.this.x.S forSome { val x: => Error.this.T }; value m has incompatible type की ओर जाता है। क्या मैं §3.2.10 गलत व्याख्या कर रहा हूं?

मूल पोस्ट: स्काला कोड का निम्न भाग में संकलक (2.9.0.1) कि विधि f2Derived में कुछ भी नहीं ओवरराइड करता है कह रही है एक त्रुटि पैदा करता है।

abstract trait Type { 
    type T1 
    type T2 
    type P = (T1, T2) 
} 

class ConcreteType extends Type { 
    type T1 = Double 
    type T2 = Double 
} 

abstract class Base { 
    type T <: Type 
    type TP = T#P 
    def f1(v: TP): TP 
    def f2(v: T#P): T#P 
    def f3(v: T#P): T#P 
} 

class Derived extends Base { 
    override type T = ConcreteType 
    override def f1(v: TP): TP = v 
    override def f2(v: T#P): T#P = v 
    override def f3(v: TP): TP = v 
} 

दूसरी ओर, के रूप में काम करता है कोड में दिखाया गया ठीक उसी हस्ताक्षर साथ समारोह f3 अधिभावी। मैं उम्मीद करता हूं कि दोनों कार्य एक ही तरीके से व्यवहार करेंगे। यह मामला क्यों नहीं है?

+0

स्कैला कंपाइलर https://issues.scala-lang.org/browse/SI-4914 के साथ खुली बग। –

उत्तर

5

(FYI करें, मैं 2.9.0.1 उपयोग कर रहा हूँ)

मैं कल्पना में इस का कारण है, लेकिन आप प्राप्त त्रुटि संदेश ढूँढने में सक्षम नहीं किया गया, कम से कम, परम कारण स्पष्ट करता है।

(Note that (_5.T1, _5.T2) forSome { val _5: Base.this.T } 
does not match 
(_16.T1, _16.T2) forSome { val _16: Base#T } 

Base.this.TBase#T के बराबर नहीं है: यह महत्वपूर्ण हिस्सा है। पूर्व उदाहरण this पर आधारित पथ-निर्भर प्रकार है, जहां उत्तरार्द्ध एक प्रकार का प्रक्षेपण है जो उदाहरण के आधार पर नहीं है।

यह प्रकार के संकल्प के क्रम के कारण प्रतीत होता है। TPBase के मूल्यांकन के संबंध में हल किया गया है जबकि T#PDerived के मूल्यांकन के संबंध में हल किया गया है।

यदि कोई व्यक्ति इस स्पेस में स्थान को इंगित कर सकता है जो इसे ठीक से समझा सकता है, तो मुझे इसे पढ़ना अच्छा लगेगा।

+0

हाय डेरेक। मुख्य भाग को इंगित करने के लिए धन्यवाद। मैं महत्वपूर्ण हिस्सा थोड़ा और निकालने में सक्षम था। मैं उपरोक्त पद को अपडेट करूंगा। –

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

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