आपका घोषणा पहले से ही काम करता है। जिस तरह से आप यह लिखा है, तथापि, स्केला अगर आप की तरह
scala> class Foo[T <: OtherT, Key[T], Value[T]]
defined class Foo
scala> new Foo[SpecialOtherT, Key[SpecialOtherT], Value[SpecialOtherT]]
<console>:13: error: Key[SpecialOtherT] takes no type parameters, expected: one
new Foo[SpecialOtherT, Key[SpecialOtherT], Value[SpecialOtherT]]
कुछ क्योंकि दोनों Key
और Value
के प्रकार पहले से ही अपने पूर्व घोषणा द्वारा दिया जाता है जारी शिकायत करेंगे। इसलिए यह
scala> new Foo[SpecialOtherT, Key, Value]
res20: Foo[SpecialOtherT,Key,Value] = [email protected]
जो संभवतः आप नहीं चाहते हैं। आप इसे कुछ हद तक जब Foo
के साथ काम है कि सभी अनावश्यक जानकारी के लिए ज़रूरत से ज़्यादा है इस
scala> class Foo[T <: OtherT, K <: Key[T], V <: Value[T]]
defined class Foo
scala> new Foo[SpecialOtherT, Key[SpecialOtherT], Value[SpecialOtherT]]
res21: Foo[SpecialOtherT,Key[SpecialOtherT],Value[SpecialOtherT]] = [email protected]
लब्बोलुआब पर लगता है कि यह कर सकता है, के बाद से Key
और Value
के प्रकार T
पर पूरी तरह निर्भर करते हैं।तो क्यों इतने की तरह एक आंतरिक प्रकार घोषणा का उपयोग नहीं:
class Foo[T <: OtherT] {
type K = Key[T]
type V = Value[T]
}
तो फिर तुम वर्ग के भीतर से और V
प्रकार K
के लिए उपयोग किया था लेकिन हर बार एक नई उत्तर बनाना लिखने की आवश्यकता नहीं होगी:
scala> new Foo[SpecialOtherT]
res23: Foo[SpecialOtherT] = [email protected]
scala> new Foo[Int]
<console>:11: error: ...
धन्यवाद! बहुत सूचनाप्रद। मेरा एकमात्र जवाब "तो एक आंतरिक प्रकार की घोषणा का उपयोग क्यों न करें" यह है कि मैं उन प्रकारों को के और वी के लिए तत्कालता पर अनुमानित करना चाहता हूं। – duckworthd
मुझे यकीन नहीं है कि मैं समझता हूं क्योंकि वास्तव में अनुमान अनुमानित है। आपके उपयोग-मामले के आधार पर, आप अभी भी "बाहरी" से प्रकार का उपयोग कर सकते हैं, उदा। 'कक्षा फू [टी]; कक्षा बार [टी] {प्रकार वी = फू [टी]}; def do कुछ [टी] (बी: बार [टी]) (अंतर्निहित एमएफ: प्रकट [बार [टी] #Wee]) {कंसोल println mf} ', और फिर 'कुछ कुछ (नया बार [डबल])'। सहमत है, यह एक गंदा उदाहरण है। – fotNelton