2011-01-06 3 views
6

Ajout de deux œuvres: Set[Int]Ajout de deux ensembles [Tous]

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) 

Mais l'ajout de deux Set[Any] ne possède pas:

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

Toute suggestion de travailler autour de cette erreur?

+2

Il a été corrigé dans scala2.9. Ajoutable a été retiré. Voir [ticket4059] [https://lampsvn.epfl.ch/trac/scala/ticket/4059] pour plus d'informations. – Eastsun

Répondre

5

Cela fonctionne:

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

Mais est laid comme le péché. Le compilateur est confus quant à l'utilisation de la méthode sur Addable ou celle sur TraversableLike, qui a un paramètre implicite. Ils n'ont pas la même signification, mais le sucre syntaxique donne l'impression qu'ils le font. Dites-lui lequel utiliser et le compilateur est heureux.

J'imagine que la raison pour laquelle cela fonctionne pour Ints est qu'ils n'ont aucun sous-type.

Ceci appellera la méthode sur ajoutable, si cela est important pour vous:

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

Ce code fonctionne, mais le type de résultat est Any, pas Set [Any]. – Landei

+0

@Landei: Vous avez raison. La valeur est un ensemble, mais il devrait être lancé. C'est intéressant. – sblundy

9

Ressemble en utilisant l'alias union œuvres,

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) 

Je suis toujours curieux de savoir s'il y a un moyen d'utiliser ++ à la place.

3

Cela fonctionne, mais ne gagnera pas le "beau code du concours":

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

Vous gagnez le concours de code le plus laid. – sblundy

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

Considérez ceci encore une autre entrée dans le concours de code le plus laid. ;)

Questions connexes