जब आप विस्तारित करते हैं तो यह थोड़ा और स्पष्ट हो जाता है (कोई भी इरादा नहीं) आपके उदाहरण को एक साधारण मामले से परे।
एकाधिक वंशानुक्रम:
class C[A] extends X with Y with Z
mixins:
val x = new X with Y
Parameterization:
class X[A <: B] extends Y[A]
एकाधिक (संबंधित) टाइप पैरामीटर:
class X[A >: B, B](x: A, xs: Seq[B])
,210
प्रसंग सीमा:
class X[A : Manifest]
देखें सीमा:
class X[A <% Ordered[A]]
जेनेरिक तरीके:
class Foo[B] {
def bar[A <: B](x: A) = ...
}
आप देख सकते हैं, रिश्ते है कि एक प्रकार पैरामीटर में निर्दिष्ट किया जा सकता एक वर्ग घोषित करते समय उपलब्ध सरल रैखिक पदानुक्रम से कहीं अधिक समृद्ध हैं, खासकर जब आप अल सीमाओं के लिए कम।
यह भी ध्यान देने योग्य बात है कि वर्ग या तरीकों के लिए सामान्य प्रकार पैरामीटर बहुत बार अनुमान लगाया जा होगा, आप लिखने के लिए अनुमति देता है लायक है:
val myList = List(1, 2, 3)
बजाय
val myList = List[Int](1, 2, 3)
तो जिस तरह अंकन उपयोग किया जाता है बहुत अलग है।
अद्यतन
एक विशिष्ट उदाहरण सिर्फ दिमाग में वसंत है, एक साथ दोनों अंकन का उपयोग प्रदर्शन और दिखा कि वे किस तरह अलग रहने के लिए की जरूरत है:
def someMethod[T <: Foo with Bar](x: T) = ...
यह जरूरी है कि टाइप परम T
Foo
और Bar
दोनों में मिश्रित कुछ उपप्रकार बनें।
ही संरचनात्मक प्रकार के साथ लागू होता है:
type Closable = { def close: Unit } //alias for a structural type
def someMethod[T <: Closable](x: T) = ...
कक्षाओं और प्रकारों –
के बीच अंतर के बारे में बात करने के लिए कक्षाओं और प्रकारों के बारे में बात करने के लिए अलग-अलग चीजों के रूप में अलग-अलग टिप्पणियों का उपयोग करने के लिए यह समझ में आता है। स्पष्टीकरण के लिए धन्यवाद। – sschaef