2011-01-06 17 views
6

追加2つのSet[Int]作品:追加2セット[任意]

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) 

しかし、2 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で修正されました。 Addableが削除されました。詳細については、[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で使用するかを混同します。彼らは同じシグネチャを持っていませんが、構文的な砂糖はそれがそうであるかのように見えます。どちらを使うべきか、そしてコンパイラが満足しているかを教えてください。

私はIntsのために働く理由は、彼らはどのようなサブタイプも持っていないということです。

これは、それはあなたにとって重要な場合は、Addableで上のメソッドを呼び出します:

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

このコードは機能しますが、結果の種類は[任意]に設定されていません。 – Landei

+0

@Landei:そうです。値はSetですが、キャストする必要があります。それは面白い。 – 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

動作することが、 "ビューティフルコードコンテスト" 勝てないだろう。

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 

最も醜いコードコンテストのこれをもう一つの項目と考えてください。 ;)

関連する問題