Добавление двух Set [Any] - PullRequest
7 голосов
/ 07 января 2011

Добавление двух Set[Int] произведений:

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

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

Ответы [ 4 ]

12 голосов
/ 07 января 2011

Похоже, что использование псевдонима 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)

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

5 голосов
/ 07 января 2011

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

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

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

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

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

Set[Any](1, 2, 3).asInstanceOf[collection.generic.Addable[Any, Set[Any]]] ++ Set[Any](4, 5, 6)
3 голосов
/ 07 января 2011
val s:scala.collection.TraversableLike[Any, Set[Any]] = Set(1,2,3)
val t:Set[Any] = Set(3,4,5)
s ++ t

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

3 голосов
/ 07 января 2011

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

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