के विरासत और प्रकार पैरामीटर मैं स्कैला 2.8 संग्रह कक्षाओं के स्रोत कोड का अध्ययन कर रहा हूं। मेरे पास scala.collection.Traversable
के पदानुक्रम के बारे में प्रश्न हैं। निम्नलिखित घोषणाओं को देखो:ट्रैवर्सबल
package scala.collection
trait Traversable[+A]
extends TraversableLike[A, Traversable[A]]
with GenericTraversableTemplate[A, Traversable]
trait TraversableLike[+A, +Repr]
extends HasNewBuilder[A, Repr]
with TraversableOnce[A]
package scala.collection.generic
trait HasNewBuilder[+A, +Repr]
trait GenericTraversableTemplate[+A, +CC[X] <: Traversable[X]]
extends HasNewBuilder[A, CC[A] @uncheckedVariance]
प्रश्न: क्यों Traversable
प्रकार पैरामीटर [A, Traversable]
साथ GenericTraversableTemplate
का विस्तार करता है - क्यों नहीं [A, Traversable[A]]
? मैं एक ही संरचना के साथ एक छोटे से कार्यक्रम के साथ कुछ प्रयोग करने की कोशिश की और एक अजीब त्रुटि संदेश मिल गया जब मैं Traversable[A]
करने के लिए इसे बदलने की कोशिश की:
error: Traversable[A] takes no type parameters, expected: one
मुझे लगता है कि GenericTraversableTemplate
में @uncheckedVariance
एनोटेशन का प्रयोग भी साथ क्या करना है इस? (यह काम करने के लिए मजबूर करने के लिए संभावित रूप से असुरक्षित हैक की तरह लगता है ...)।
संपादित - this question में एनोटेशन बारे में कुछ उपयोगी जवाब मिल गया (ऐसा इसलिए है क्योंकि GenericTraversableTemplate
दोनों परिवर्तनशील और अपरिवर्तनीय संग्रह जो विभिन्न विचरण है के लिए प्रयोग किया जाता है)।
प्रश्न: आप पदानुक्रम को देखते हैं, आप देखते हैं कि Traversable
inherits HasNewBuilder
दो बार (एक बार TraversableLike
के माध्यम से और एक बार GenericTraversableTemplate
के माध्यम से), लेकिन थोड़ा अलग प्रकार मानकों के साथ। यह वास्तव में कैसे काम करता है? विभिन्न प्रकार के पैरामीटर एक त्रुटि क्यों नहीं करते हैं?
इस उत्तर का उत्तर देने के लिए समय निकालने के लिए धन्यवाद! मैंने पहले "प्रकार" के बारे में सुना होगा लेकिन वास्तव में यह समझ में नहीं आया कि अब तक उनका क्या मतलब है। – Jesper