संपादित करें: त्रुटि संदेश के महत्वपूर्ण भाग को इंगित करने वाले डेरेक के लिए धन्यवाद, मैं महत्वपूर्ण भाग को थोड़ा और निकालने में सक्षम था और यह मौजूदा प्रकारों के बारे में प्रतीत होता है। यदि मैं §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) कि विधि f2
Derived
में कुछ भी नहीं ओवरराइड करता है कह रही है एक त्रुटि पैदा करता है।
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
अधिभावी। मैं उम्मीद करता हूं कि दोनों कार्य एक ही तरीके से व्यवहार करेंगे। यह मामला क्यों नहीं है?
स्कैला कंपाइलर https://issues.scala-lang.org/browse/SI-4914 के साथ खुली बग। –