के साथ वर्ग के लिए लागू सबूत यहां दो लक्षणों के साथ एक सरल सेटअप है, एक वर्ग जो पिछले गुणों से घिरे एक कॉन्वेंट प्रकार के पैरामीटर के साथ है, और दूसरी कक्षा द्वारा बाध्य प्रकार के पैरामीटर वाला दूसरा वर्ग है। दोनों वर्गों के लिए, एक विशेष विधि उपलब्ध है (अंतर्निहित सबूत के माध्यम से) केवल दो गुणों में से एक टाइप पैरामीटर को कम करता है। यह ठीक संकलित:स्कैला: प्रकार पैरामीटर
trait Foo
trait ReadableFoo extends Foo {def field: Int}
case class Bar[+F <: Foo](foo: F) {
def readField(implicit evidence: F <:< ReadableFoo) = foo.field
}
case class Grill[+F <: Foo, +B <: Bar[F]](bar: B) {
def readField(implicit evidence: F <:< ReadableFoo) = bar.readField
}
हालांकि, बाद से Bar
covariant है F
में, मैं Grill
में F
पैरामीटर की आवश्यकता नहीं होनी चाहिए। मुझे बस B
की आवश्यकता है Bar[ReadableFoo]
का एक उप प्रकार है। लेकिन यह विफल रहता है:
case class Grill[+B <: Bar[_]](bar: B) {
def readField(implicit evidence: B <:< Bar[ReadableFoo]) = bar.readField
}
त्रुटि के साथ
:
error: Cannot prove that Any <:< this.ReadableFoo.
def readField(implicit evidence: B <:< Bar[ReadableFoo]) = bar.readField
क्यों अंतर्निहित सबूत ध्यान में नहीं रखा जा रहा है?
मुझे यकीन है कि अगर <नहीं कर रहा हूँ: <कहा जा करने के लिए है, यह केवल एक मान है जो मौजूद है यदि पहला पैरामीटर दूसरे का उप प्रकार है। कार्यान्वयन मूल रूप से पहचान समारोह है। वे उदाहरण काम करते हैं क्योंकि वे मूल रूप से एक (सुरक्षित) टाइपकास्ट कर रहे हैं जो संकलक को readField विधि के लिए अंतर्निहित पैरामीटर खोजने में मदद करता है। – Kaito
@ कaitो: क्या आपके पास कोई सबूत है कि '<: <' '' '' लागू होने का मतलब नहीं है? यह [दस्तावेजी व्यवहार] है (http://www.scala-lang.org/api/rc/scala/Predef$$$less$colon$less.html)। आप '(बार: बार [पठनीय फू]) लिख सकते हैं। ReadField' और अंतर्निहित रूपांतरण स्वचालित रूप से किक कर दें, लेकिन स्किस का संस्करण मुझे क्लीनर महसूस करता है। –
@TravisBrown: कोई नहीं। लेकिन मुझे उस रेखा को नहीं मिल रहा है जो वास्तव में कार्य के व्यवहार को मौखिक रूप से दस्तावेज करता है, केवल अमूर्त फ़ंक्शन 1 विशेषता का विरासत स्पष्टीकरण। मैं मानता हूं कि यह अच्छा है लेकिन मुझे यकीन नहीं है कि क्या उस व्यवहार पर भरोसा किया जा सकता है, यह मेरे अगले संस्करण में एक अपवाद फेंक सकता है। – Kaito