【问题标题】:Adding two Set[Any]添加两个 Set[Any]
【发布时间】:2011-06-04 22:42:21
【问题描述】:

添加两个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)
           ^

有解决此错误的建议吗?

【问题讨论】:

标签: scala scala-2.8 scala-collections


【解决方案1】:

看起来使用别名 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)

我仍然很好奇是否有办法使用++

【讨论】:

    【解决方案2】:

    这行得通:

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

    但丑如罪。编译器对于是使用 Addable 上的方法还是使用 TraversableLike 上的方法感到困惑,后者具有隐式参数。它们没有相同的 sig,但语法糖使它看起来好像它们有。告诉它使用哪一个,编译器会很高兴。

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

    如果这对您很重要,这将调用 Addable 上的方法:

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

    【讨论】:

    • @Landei:你是对的。该值是一个集合,但必须强制转换。这很有趣。
    【解决方案3】:

    这行得通,但不会赢得“美丽代码竞赛”:

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

    【讨论】:

      【解决方案4】:
      val s:scala.collection.TraversableLike[Any, Set[Any]] = Set(1,2,3)
      val t:Set[Any] = Set(3,4,5)
      s ++ t
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 2012-01-18
        • 2014-09-27
        相关资源
        最近更新 更多