2011-01-06 12 views
6

dodanie dwóch Set[Int] utwory:dodanie dwóch ustaw [Wszystkie]

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) 

Ale dodanie dwóch Set[Any] nie:

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) 
     ^

Wszelkie sugestie, aby obejść ten problem?

+2

Zostało to naprawione w scala2.9. Dodatek został usunięty. Więcej informacji znajduje się w [ticket4059] [https://lampsvn.epfl.ch/trac/scala/ticket/4059]. – Eastsun

Odpowiedz

5

to działa:

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

Ale jest brzydki jak grzech. Kompilator nie ma pewności, czy użyć metody na Addable, czy tej na TraversableLike, która ma niejawny parametr. Nie mają tego samego siga, ale cukier syntaktyczny sprawia, że ​​wygląda tak, jakby to robił. Powiedz, którego użyć, a kompilator jest szczęśliwy.

Wyobrażam sobie, że powodem dla Ints jest to, że nie mają żadnych podtypów.

Będzie to wywołać metodę na addable, jeśli to dla ciebie ważne:

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

Ten kod działa, ale typem wyniku jest Any, a nie Set [Any]. – Landei

+0

@Landei: Masz rację. Wartość jest zbiorem, ale musiałaby zostać rzucona. To interesujące. – sblundy

9

Wygląda na to, używając aliasu union prace,

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) 

wciąż jestem ciekaw, czy jest jakiś sposób na wykorzystanie ++ zamiast.

3

który działa, ale nie wygra "Beautiful kodu konkursie":

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

Wygrywasz najgorszy konkurs na kod. – sblundy

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

Rozważ ten kolejny wpis w najbrzydszym konkursie na kod. ;)

Powiązane problemy