2011-07-18 18 views
6
में एक ओवरलोड निर्माता कॉल नहीं कर सकता

मेरे कोड इस तरह दिखता है: क्यों दूसरा विकल्प नहीं हैस्काला

overloaded method constructor Table with alternatives: 
    (rows: Int,columns: Int)scala.swing.Table 
    <and> 
    (rowData: Array[Array[Any]],columnNames: Seq[_])scala.swing.Table 
    cannot be applied to 
    (Array [Array[java.lang.String]], Seq[java.lang.String]) 

मैं नहीं दिख रहा है:

val people = Array(Array("John", "25"), Array("Mary", "22")) 
val headers = Seq("Name", "Age") 
val myTable = new Table(people, headers) 

मैं इस वाक्य रचना त्रुटि मिलती है उपयोग किया गया। क्या "कोई" और "_" के बीच कोई अंतर है जो मुझे यहां पहुंचा रहा है?

उत्तर

5

किम जैसा कि पहले ही कहा, तुम क्योंकि स्काला के अरास जावा के/सी # की तरह covariant नहीं कर रहे हैं, उसके तत्व प्रकार में अपने सरणी covariant बनाने की जरूरत है।

इस कोड को यह उदाहरण के लिए काम कर देगा:

class Table[+T](rowData: Array[Array[T]],columnNames: Seq[_]) 

यह सिर्फ संकलक कि T covariant किया जाना चाहिए बताता है (इस के समान है जावा के ? extends T या सी # के out T)।

आपको अधिक नियंत्रण के बारे में प्रकार की अनुमति नहीं है और जो कर रहे हैं की जरूरत है, तो आप भी उपयोग कर सकते हैं:

class Table[T <: Any](rowData: Array[Array[T]],columnNames: Seq[_]) 

इस संकलक कि T (Any के किसी भी उप-प्रकार जो Any से बदला जा सकता है हो सकता है बता देंगे आपके उदाहरण में CharSequence जैसी कक्षा के लिए)।

दोनों मामलों

इस परिदृश्य में एक ही काम करते हैं:

scala> val people = Array(Array("John", "25"), Array("Mary", "22")) 
people: Array[Array[java.lang.String]] = Array(Array(John, 25), Array(Mary, 22)) 

scala> val headers = Seq("Name", "Age") 
headers: Seq[java.lang.String] = List(Name, Age) 

scala> val myTable = new Table(people, headers) 
myTable: Table[java.lang.String] = [email protected] 

संपादित करें:

val people: Array[Array[Any]] = Array(Array("John", "25"), Array("Mary", "22")) 
:
तो सवाल में वर्ग अपने नियंत्रण में नहीं है, आप किस प्रकार इस तरह स्पष्ट रूप से चाहते हैं की घोषणा

अद्यतन

इस सवाल में स्रोत कोड है:

// TODO: use IndexedSeq[_ <: IndexedSeq[Any]], see ticket [#2005][1] 
def this(rowData: Array[Array[Any]], columnNames: Seq[_]) = { 

मुझे आश्चर्य है कि अगर किसी को वैकल्पिक हल निकालने के लिए भूल गया, # मई 2005 2011 के बाद से तय हो गई है, क्योंकि ...

+0

मुझे लगता है कि यह है कि टेबल संभालने मेरी कक्षा है। मुझे जिस तालिका की आवश्यकता है वह scala.swing.Table है। इसके अलावा, asInstanceOf मदद करने के लिए प्रतीत नहीं होता है। –

+0

धन्यवाद, स्पष्ट टाइपिंग काम करता है। (मैंने सोचा कि मैं पहले की कोशिश की थी, लेकिन मैं मैं पुराने वस्तु कोड उपयोग कर रहा था लगता है।) मैं देख रहा हूँ मैं पंक्तियों और स्तंभों उलट है - ठीक है, कि आसान है - और मेरी हेडर दिखाई नहीं देती हैं।हालांकि, मैं जो कर रहा हूं उसके लिए महत्वपूर्ण नहीं है। –

3

Array[Array[String]]Array[Array[Any]] का एक उप प्रकार है क्योंकि ऐरे का प्रकार पैरामीटर कॉन्वेंट नहीं है। आपको co-, contra- and invariance पर पढ़ना चाहिए। यह इसे ठीक करना चाहिए:

val people = 
    Array(Array("John", "25"), Array("Mary", "22")).asInstanceOf[Array[Array[Any]] 
+0

यह सच मैं उन बहुत समझ में नहीं आता है कुंआ। हालांकि, वैल लोग: सरणी [सरणी [कोई]] = सरणी (सरणी ("जॉन", "25"), सरणी ("मैरी" "22")) एक त्रुटि संदेश नहीं देता है। मैं मैंने पूछा जाना चाहिए था लगता है: "मैं अपने कोड ठीक कर सकते हैं" धन्यवाद! –