2011-01-06 1 views
6

Добавление два Set[Int] работы:Добавление два Set [Любая]

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) 

Но добавление двух Set[Any] не делает:

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

Любое предложение, чтобы обойти эту ошибку?

+2

Это было исправлено в scala2.9. Добавлена ​​удалена. Дополнительную информацию см. В [ticket4059] [https://lampsvn.epfl.ch/trac/scala/ticket/4059]. – Eastsun

ответ

5

Это работает:

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

Но это некрасиво, как грех. Компилятор смущен относительно того, следует ли использовать метод Addable или один из TraversableLike, который имеет неявный параметр. У них нет такого же сига, но синтаксический сахар заставляет его выглядеть так, как будто они это делают. Скажите, какой из них использовать, а компилятор - счастлив.

Я предполагаю, что причина, по которой она работает для Интов, заключается в том, что у них нет подтипов.

Это вызовет метод на Addable, если это важно для вас:

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

Этот код работает, но тип результата - Any, а не Set [Any]. – Landei

+0

@ Landei: Вы правы. Значение представляет собой набор, но его нужно будет отличать. Это интересно. – sblundy

9

Похоже, с помощью псевдонима union работы,

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) 

Я все еще интересно, если есть способ использовать ++ вместо этого.

3

Это работает, но не выиграет "Beautiful Code Contest":

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

Вы выигрываете самый уродливый кодовый конкурс. – sblundy

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

Рассмотрите эту еще одну запись в уродливом кодексе. ;)

Смежные вопросы