2011-01-06 50 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 2011-01-07 03:20:14

回答

5

这工作:

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

不过是丑陋的罪过。编译器对于在Addable上使用方法还是在TraversableLike上使用方法感到困惑,后者有一个隐式参数。它们没有相同的信号,但是语法糖使它看起来好像它们一样。告诉它哪一个使用和编译器很开心。

我想象它适用于Ints的原因是它们没有任何子类型。

这将调用上可添加的方法,如果这对你很重要:

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

此代码有效,但结果类型为Any,而不是[Any]。 – Landei 2011-01-06 22:05:38

+0

@兰代:你说得对。该值是一个Set,但它必须被施放。那很有意思。 – sblundy 2011-01-06 22:07:32

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

这样的作品,但不会赢得 “美丽代码大赛”:

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

在最丑陋的代码竞赛中考虑这个又一个条目。 ;)