2011-01-06 5 views
6

Hinzufügen von zwei Set[Int] Werke:Hinzufügen von zwei Set [Alle]

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) 

Aber das Hinzufügen von zwei Set[Any] nicht:

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

Jeder Vorschlag, um diesen Fehler zu arbeiten?

+2

Es wurde in scala2.9 behoben. Addierbar wurde entfernt. Weitere Informationen finden Sie unter [ticket4059] [https://lampsvn.epfl.ch/trac/scala/ticket/4059]. – Eastsun

Antwort

5

Dies funktioniert:

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

Aber ist als Sünde hässlich. Der Compiler ist verwirrt, ob die Methode auf Addable oder die auf TraversableLike, die einen impliziten Parameter hat, verwendet werden soll. Sie haben nicht dasselbe Sig, aber syntaktischer Zucker lässt es erscheinen, als ob sie tun. Sag ihm, welcher zu verwenden ist und der Compiler ist glücklich.

Ich kann mir vorstellen, dass es für Ints funktioniert, dass sie keine Subtypen haben.

Dies wird die Methode auf Hinzufügbare rufen, wenn das für Sie wichtig ist:

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

Dieser Code funktioniert, aber der Ergebnistyp ist Any, nicht Set [Any]. – Landei

+0

@Landei: Du hast Recht. Der Wert ist ein Set, aber es müsste umgewandelt werden. Das ist interessant. – sblundy

9

sucht der Alias ​​union funktioniert wie verwenden,

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) 

Ich bin immer noch neugierig, ob es einen Weg gibt, ++ stattdessen zu verwenden.

3

das, aber nicht gewinnt den "Schöne-Code Contest" funktioniert:

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

Sie gewinnen den hässlichsten Code-Wettbewerb. – sblundy

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

Betrachten Sie diesen noch einen Eintrag im hässlichsten Code-Wettbewerb. ;)