मान लीजिए मेरे पास दो कक्षाएं हैं, Input
और Output
, जिन्हें एक दूसरे से कनेक्ट करने के लिए डिज़ाइन किया गया है। Output
कुछ प्रकार के मान उत्पन्न करता है, और Input
उन्हें खपत करता है।स्कैला इस उदाहरण में टाइप पैरामीटर का अनुमान क्यों नहीं लगा सकता है?
class Input[T] {
var output: Option[Output[_ <: T]] = None
}
class Output[T] {
var input: Option[Input[_ >: T]] = None
}
अगर एक Input
और Output
जोड़ी मूल्य का एक ही तरह पर जब तक Input
प्रकार पैरामीटर Output
प्रकार पैरामीटर के महाप्रकार है काम नहीं करते यह ठीक है। ध्यान दें कि दोनों वर्गों में प्रकार पैरामीटर invariant है; वास्तविक संस्करणों में इसका उपयोग दोनों सह-और contravariant पदों में किया जाता है।
val out = new Output[String]
val in = new Input[AnyRef]
connect(out, in)
:
def connect[T](output: Output[T], input: Input[_ >: T]) = {
output.input = Some(input)
input.output = Some(output)
}
अगर मैं नीचे के रूप में इस विधि कहते हैं, मैं एक प्रकार त्रुटि मिलती है:
मैं कहीं और एक connect
विधि है जो एक Input
/Output
जोड़ी के बीच एक कड़ी सेट है त्रुटि है:
test.scala:17: error: type mismatch;
found : Output[String]
required: Output[AnyRef]
connect(out, in)
^
मैं कर सकता हूँ टाइप पैरामीटर लिखकर इसे हल करें (इस मामले में, मैं connect[String]
लिखूंगा, लेकिन मुझे लगता है कि संकलक मेरे लिए इसे समझने में सक्षम होना चाहिए। मैं connect
विधि कैसे बदल सकता हूं ताकि प्रकार पैरामीटर स्वचालित रूप से अनुमानित हो?
संपादित करें: अभी के लिए, मैं connect
Output
की एक विधि है, तो यह प्रकार पैरामीटर स्वचालित रूप से हो जाता है बना दिया है। इसमें अतिरिक्त लाभ भी है कि मैं इंफिक्स नोटेशन out connect in
का उपयोग कर सकता हूं, लेकिन डिज़ाइन थोड़ा अजीब लगता है।
मुझे अभी भी दिलचस्पी है कि संकलक इस व्यवहार को क्यों प्रदर्शित करता है। मुझे लगता है कि यह प्रकार पैरामीटर का अनुमान लगाने में सक्षम होना चाहिए। क्या यह वास्तव में निर्दिष्ट के रूप में काम कर रहा है?
क्या आपका मतलब है "उसी प्रकार के मूल्य पर * काम न करें" –
क्या आपने स्कैला मेलिंग सूची में प्रश्न पूछने का प्रयास किया है? – GClaramunt