2011-01-06 11 views
6

जोड़ना दो Set[Int] काम करता है:जोड़ना दो सेट [कोई]

Welcome to Scala version 2.8.1.final (Java HotSpot(TM) Server VM, Java 1.6.0_23). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> Set(1,2,3) ++ Set(4,5,6)   
res0: scala.collection.immutable.Set[Int] = Set(4, 5, 6, 1, 2, 3) 

लेकिन दो Set[Any] जोड़ने नहीं करता है:

scala> Set[Any](1,2,3) ++ Set[Any](4,5,6) 
<console>:6: error: ambiguous reference to overloaded definition, 
both method ++ in trait Addable of type (xs: scala.collection.TraversableOnce[Any])scala.collection.immutable.Set[Any] 
and method ++ in trait TraversableLike of type [B >: Any,That](that: scala.collection.TraversableOnce[B])(implicit bf: scala.collection.generic.CanBuildFrom[scala.collection.immutable.Set[Any],B,That])That 
match argument types (scala.collection.immutable.Set[Any]) 
    Set[Any](1,2,3) ++ Set[Any](4,5,6) 
     ^

कोई भी सुझाव इस त्रुटि को हल करने के लिए?

+2

यह scala2.9 में तय किया गया था। Addable हटा दिया गया था। अधिक जानकारी के लिए [टिकट 4059] [https://lampsvn.epfl.ch/trac/scala/ticket/4059] देखें। – Eastsun

उत्तर

5

यह काम करता है:

Set[Any](1, 2, 3).++[Any, Set[Any]](Set[Any](4, 5, 6)) 

लेकिन पाप के रूप में बदसूरत है। कंपाइलर इस बात के बारे में उलझन में है कि क्या एडैडेबल या ट्रैवर्सबल लाइक पर एक विधि का उपयोग करना है, जिसमें एक अंतर्निहित पैरामीटर है। उनके पास एक ही सिग नहीं है, लेकिन सिंटेक्टिक चीनी ऐसा प्रतीत होता है जैसे वे करते हैं। इसे बताएं कि किस का उपयोग करना है और कंपाइलर खुश है।

मुझे लगता है कि यह इंट्स के लिए काम करने का कारण यह है कि उनके पास कोई उपप्रकार नहीं है।

यह addable पर विधि कॉल होगा अगर है कि आप के लिए महत्वपूर्ण है:

Set[Any](1, 2, 3).asInstanceOf[collection.generic.Addable[Any, Set[Any]]] ++ Set[Any](4, 5, 6) 
+0

यह कोड काम करता है, लेकिन परिणाम प्रकार कोई है, सेट नहीं [कोई भी]। – Landei

+0

@ लांदेई: आप सही हैं। मान एक सेट है, लेकिन इसे कास्ट करना होगा। यह तो दिलचस्प है. – sblundy

9

उर्फ ​​union काम करता है,

scala> Set[Any](1,2,3) union Set[Any](4,5,6) 
res0: scala.collection.immutable.Set[Any] = Set(4, 5, 6, 1, 2, 3) 

का उपयोग कर की तरह लग रहा है मैं अभी भी उत्सुक हूँ वहाँ के बजाय ++ उपयोग करने के लिए कोई तरीका है।

3

काम करता है यही कारण है, लेकिन "सुंदर कोड प्रतियोगिता" जीत नहीं होगा:

Set[Any](1,2,3).++[Any,Set[Any]](Set[Any](4,5,6)) 
+6

आप सबसे उग्र कोड प्रतियोगिता जीत रहे हैं। – sblundy

3
val s:scala.collection.TraversableLike[Any, Set[Any]] = Set(1,2,3) 
val t:Set[Any] = Set(3,4,5) 
s ++ t 

Ugliest कोड प्रतियोगिता में अभी तक एक और प्रविष्टि पर विचार करें। ;)

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