2011-01-06 8 views
6

l'aggiunta di due Set[Int] opere:L'aggiunta di due set [Qualsiasi]

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) 

Ma l'aggiunta di due Set[Any] non:

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

Qualsiasi suggerimento per risolvere questo errore?

+2

È stato risolto in scala2.9. Addable è stato rimosso. Vedi [ticket4059] [https://lampsvn.epfl.ch/trac/scala/ticket/4059] per ulteriori informazioni. – Eastsun

risposta

5

Questo funziona:

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

Ma è brutto come il peccato. Il compilatore è confuso se utilizzare il metodo su Addable o quello su TraversableLike, che ha un parametro implicito. Non hanno lo stesso sig, ma lo zucchero sintattico fa sembrare come se lo facessero. Dillo quale usare e il compilatore è felice.

Immagino che la ragione per cui lavora per Ints sia che non hanno sottotipi.

Ciò chiamerà il metodo su cumulabili, se questo è importante per voi:

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

Questo codice funziona, ma il tipo di risultato è Qualsiasi, non impostato su [Qualsiasi]. – Landei

+0

@Landei: hai ragione. Il valore è un Set, ma dovrebbe essere lanciato. Interessante. – sblundy

9

Sembra utilizzando l'alias union opere,

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) 

Sono ancora curioso di sapere se c'è un modo per utilizzare ++ invece.

3

che funziona, ma non vincerà il "codice bello Contest":

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

Stai vincendo il concorso di codice più brutto. – sblundy

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

Considera questa ennesima voce nel più brutto contest di codice. ;)

Problemi correlati