2011-09-27 10 views
12

जैसे एक सामान्य इंटरफ़ेस को देखते हुए निम्नलिखितस्कैला में जेनिक्स: एक इंटरफ़ेस/विशेषता दो बार कार्यान्वित करना?

interface I<T> { 
    void m(T t); 
} 

मैं सी # में एक वर्ग है कि मैं दो बार लागू करता है (या अधिक) टी, जैसे के लिए आपूर्ति की विभिन्न प्रकार के साथ बनाने के

class C : I<int>, I<String> { 
    public void m(int i) { } 
    public void m(String s) { } 
} 

यह जावा में सामान्य प्रकार की जानकारी का विलोपन की वजह से नहीं किया जा सकता है, लेकिन कुछ इस तरह स्काला में प्राप्त किया जा सकता?

+0

क्या आप स्कैला कोड में वर्णन कर सकते हैं कि आप क्या करना चाहते हैं। यहां पर कई लोग सी # से परिचित नहीं हैं। – Jus12

+0

ठीक है, मैं स्कैला से परिचित नहीं हूं (सीखने की कोशिश कर रहा हूं :))। हालांकि, ऊपर दिए गए कोड को जावा के बारे में जानने वाले किसी भी व्यक्ति के लिए समझना आसान होना चाहिए, जब तक आप जानते हैं कि इस सेटिंग में "कक्षा सी" के बाद ":" का अर्थ जावा-बोल में "उपकरण" है। मैंने स्कैला में जो कोशिश की है, वह मुझे एक विशेषता (केवल "इंटरफ़ेस" को "विशेषता" के साथ प्रतिस्थापित करने के लिए है), और फिर सी को परिभाषित करता है क्योंकि "कक्षा सी II {..." के साथ विस्तारित करता है, लेकिन यह काम नहीं करता है । – Eyvind

+0

स्कैला जेनेरिक प्रकारों में '[]' में संलग्न हैं, इसलिए आप इसे 'I [Int]' और 'I [स्ट्रिंग]' के रूप में करेंगे। क्या आपने घोषणा में 'क्लासमैनिफेस्ट' का उपयोग करने की कोशिश की है? – Jus12

उत्तर

12

सं मिश्रण है स्काला में केवल तभी संभव है 2 प्रकार जो विशेषता (इंटरफेस) के साथ प्रकार है कि एक दूसरे के लिए अनुरूप और साथ parametrized है विशेषता एक ही कक्षा में दो बार सीधे में मिश्रित नहीं होती है। यह सुनिश्चित करने के लिए कि 2 प्रकार एक दूसरे के अनुरूप हैं, आपको आम तौर पर टाइप पैरामीटर कॉन्विएन्ट (+) बनाना होगा।

उदाहरण के लिए, इस लिए अनुमति नहीं है:

scala> trait A[+T] { def foo: T = sys.error() } 
defined trait A 

scala> class C extends A[AnyRef] with A[String] 
<console>:8: error: trait A is inherited twice 
     class C extends A[AnyRef] with A[String] 

लेकिन यह है:

scala> trait A[+T] { def foo: T = sys.error() } 
defined trait A 

scala> class C extends A[AnyRef] 
defined class C 

scala> class B extends C with A[String] 
defined class B 

नोट इस मामले में आप प्राप्त नहीं होगा कि अर्थ विज्ञान अधिक भार के रूप में के साथ सी # मामला है , लेकिन ओवरराइडिंग अर्थशास्त्र - अनुरूप हस्ताक्षर के साथ A में सभी विधियों को एक विधि में सबसे विशिष्ट हस्ताक्षर के साथ जोड़ा जाएगा, मेथो चुनना linearization rules के अनुसार, प्रत्येक बार जब आप विशेषता को मिश्रित करते हैं, तो एक विधि होने के बजाय

10

नहीं, यह नहीं हो सकता है। आम तौर पर क्या मैं इस मामले में क्या एक ही विशेषता में

class C { 
    object IInt extends I[Int] { ... } 
    object IString extends I[String] { ... } 
    ... 
} 
संबंधित मुद्दे