2011-01-06 8 views
6

la adición de dos obras: Set[Int]la adición de dos Ajuste [Cualquier]

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) 

embargo, la adición de dos Set[Any] no:

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

Cualquier sugerencia para evitar este error?

+2

Se corrigió en scala2.9. Addable fue eliminado. Ver [ticket4059] [https://lampsvn.epfl.ch/trac/scala/ticket/4059] para más información. – Eastsun

Respuesta

5

Esto funciona:

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

Pero es feo como el pecado. El compilador no sabe si usar el método en Addable o el de TraversableLike, que tiene un parámetro implícito. No tienen la misma sig, pero el azúcar sintáctico hace que parezca que sí. Dígale cuál usar y el compilador está feliz.

Imagino que la razón por la que funciona para los Ints es que no tienen ningún subtipo.

Esto llamará al método en que se puede añadir, si eso es importante para usted:

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

Este código funciona, pero el tipo de resultado es Cualquiera, no establecido [Cualquiera]. – Landei

+0

@Landei: Tienes razón. El valor es un conjunto, pero tendría que ser lanzado. Eso es interesante. – sblundy

9

Parece que usando el alias union obras,

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) 

Todavía estoy ansioso por ver si hay una manera de utilizar ++ lugar.

3

que funciona, pero no va a ganar el "Concurso Código Beautiful":

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

Estás ganando el concurso de códigos más feo. – sblundy

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

Considere esta otra entrada más en el concurso de código más feo. ;)

Cuestiones relacionadas