2010-01-22 11 views
6

निम्नलिखित लक्षण और कक्षा को देखते हुए। यह संकलन क्यों करता है? क्या यह वास्तव में कुछ के लिए इस्तेमाल किया जा सकता है?अमूर्त प्रकार के सदस्यों के साथ कंक्रीट कक्षाएं

trait Container { 
    type A 
} 

trait AnotherContainer[B]{ 
    def x(b : B) : B 
} 

trait Mixed extends Container with AnotherContainer[Container#A] 

class Impl extends Mixed{ 
    def x(a : Container#A) = a 
} 

new Impl().x _ 

scala> new Impl().x _ 
res0: (Container#A) => Container#A = <function> 

अद्यतन:

class Baz { type T; } 

वास्तव में एक सुविधा है, लेकिन मैं इसके लिए प्रेरणा नहीं मिल सका: #1753

+0

मुझे एक बग की तरह लग रहा है। –

+0

क्यों? मिश्रित में एक और कॉन्टैनेर के उदाहरण में बी ए है, इसलिए x के लिए हस्ताक्षर दूसरेContainer.x और Impl.x के बीच संगत है। या क्या मैं कुछ न कुछ भूल रहा हूं? –

+0

@ रैंडल वेल, 'टाइप ए' सार है, और मुझे यह कहीं भी ठोस नहीं दिख रहा है। तो मैं उम्मीद करता हूं कि 'इंपल' संकलित न करें, "अमूर्त होने की आवश्यकता" त्रुटि लौटाएं। –

उत्तर

2

यदि मेरे लिए बेकार है तो यह हानिरहित दिखता है। जिस प्रकार x चाहता है वह मौजूद नहीं है, इसलिए आप इसे विधि में पास नहीं कर सकते हैं। चाहे हानिरहित बेकारता संकलन-समय त्रुटि होनी चाहिए स्वाद का विषय है, मुझे लगता है।

आप पर क्या वास्तव में x करता देखें, तो यह thusly decompiles:

public java.lang.Object x(java.lang.Object); 
    Code: 
    0: aload_1 
    1: areturn 

जो वास्तव में क्या पहचान विधि क्या करना चाहिए (, प्रकार की परवाह किए बिना तर्क लोड इसे वापस)। आप बहुत कम कोड के साथ कुछ बराबर लिख सकते हैं:

trait AbstractType { type T } 
class Useless extends AbstractType { def identity(t: AbstractType#T) = t } 

कुछ भी नहीं सिवाय AbstractType # टी टाइप है, तो फिर हम अनुपयोगिता की है।

जब तक मुझे कुछ याद नहीं आ रहा है।

3

आपके उदाहरण में, कंपाइलर >: Nothing <: Any की डिफ़ॉल्ट प्रकार सीमा जोड़ता है। नीचे दिया गया दूसरा उदाहरण एक ऐसा मामला दिखाता है जहां एक अमूर्त प्रकार उपयोग योग्य हो जाता है (यदि उपयोगी नहीं है)।

scala> trait T { type A >: Nothing <: Any } 
defined trait T 

scala> 1: T#A 
<console>:6: error: type mismatch; 
found : Int(1) 
required: T#A 
     1: T#A 
    ^

scala> trait T { type A >: Int <: Int } 
defined trait T 

scala> 1: T#A       
res6: T#A = 1 

scala> "": T#A 
<console>:6: error: type mismatch; 
found : java.lang.String("") 
required: T#A 
     "": T#A 
    ^
+1

'विशेषता टी {प्रकार ए>: Int <: Int}' 'विशेषता टी {प्रकार ए = Int} 'को परिभाषित करने का एक जटिल तरीका है, परिणाम वही है। –

+0

हाँ, यही वह बिंदु था जिसे मैंने व्यक्त करने की कोशिश की थी। – retronym

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