2012-07-17 6 views
9

मैंने एक विधि लिखा है जो सेक [स्ट्रिंग] के सभी उप-वर्गों की वस्तुओं को स्वीकार करता है। दुर्भाग्यवश यह ऐरे [स्ट्रिंग] प्रकार की वस्तु को स्वीकार नहीं करेगा। क्या ऐरे [स्ट्रिंग] सेक [स्ट्रिंग] का उप-वर्ग नहीं है?क्या ऐरे [स्ट्रिंग] स्कैला में सेक [स्ट्रिंग] का उप-वर्ग नहीं है?

scala> def test[T <: Seq[String]](x: T) = {} 
test: [T <: Seq[String]](x: T)Unit 

scala> val data = "This is a test string" 
data: java.lang.String = This is a test string 

scala> test(data.split(" ")) 
<console>:10: error: inferred type arguments [Array[java.lang.String]] do not conform to method test's type parameter bounds [T <: Seq[String]] 
       test(data.split(" ")) 

उत्तर

10

नहीं है, Array[String], नियमित रूप से JVM सरणियों के लिए अनुवाद जिन्हें आप जावा में देखने की तरह: String[]

कारण है कि आप अन्य स्काला Seq संग्रह पर Array[String] कि आप देख पर सभी कार्यों को देखने के है कि वहाँ Array[T] से ArrayOps[T] के लिए एक implicit conversion है।

यह करें:

def test[T <% Seq[String]](x: T) = {} 

यह बाध्य एक दृश्य कहा जाता है। इसका मतलब है कि T या तो Seq[String] का उप-प्रकार होना चाहिए या T को Seq[String] में परिवर्तित करने वाले दायरे में एक अंतर्निहित रूपांतरण होना चाहिए। परदे के पीछे, संकलक वास्तव में test को एक अंतर्निहित पैरामीटर जोड़ है, तो इस विधि का हो जाता है:

scala> def test[T <% Seq[String]](x: T) = {} 
test: [T](x: T)(implicit evidence$1: T => Seq[String])Unit 

यह implicit evidence$1 समारोह जो अब निहित विधि के मुख्य भाग में Seq[String] को T से रूपांतरण के रूप में कार्य करता है।

+2

दृश्य के काम को थोड़ा सा समझाएं और यह उत्तर यहां आने वाली सभी महत्वपूर्ण चीजों को समझाएगा। – sschaef

+0

बहुत प्रबुद्ध। मैं अभी भी स्कैला के लिए नया हूं और सीमाएं मेरे लिए नई हैं। मैं उसमें प्रवेश करूंगा। आपके त्वरित उत्तर के लिए धन्यवाद। –

3

स्रोतों (या API docs) राज्य, कि Array रूप

final class Array[T] extends Serializable with Cloneable 

है यही कारण है कि परिभाषित किया गया है, यह Seq की एक उप प्रकार नहीं है। हालांकि, दस्तावेज़ों में एक अंतर्निहित रूपांतरण WrappedArray का भी उल्लेख है, जहां उत्तरार्द्ध Seq का सबसेट है।

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