2011-01-06 29 views
6

Thêm hai Set[Int] công trình:Thêm hai Set [Bất kỳ]

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) 

Nhưng thêm hai Set[Any] không:

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

Bất kỳ gợi ý để làm việc xung quanh lỗi này?

+2

Nó đã được sửa trong scala2.9. Addable đã bị xóa. Xem [ticket4059] [https://lampsvn.epfl.ch/trac/scala/ticket/4059] để biết thêm thông tin. – Eastsun

Trả lời

5

này hoạt động:

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

Nhưng là xấu xí như tội lỗi. Trình biên dịch bị nhầm lẫn là liệu có nên sử dụng phương thức trên Addable hoặc phương thức trên TraversableLike, có tham số ngầm không. Họ không có cùng một sig, nhưng cú pháp đường làm cho nó xuất hiện như thể họ làm. Cho nó biết cái nào để sử dụng và trình biên dịch vui.

Tôi tưởng tượng lý do nó hoạt động cho Ints là chúng không có bất kỳ loại phụ nào.

này sẽ gọi phương thức trên thích nghi được, nếu đó là quan trọng với bạn:

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

Mã này hoạt động, nhưng loại kết quả là Không, không đặt [Bất kỳ]. – Landei

+0

@Landei: Bạn nói đúng. Giá trị là một Set, nhưng nó sẽ phải được cast. Nó thật thú vị. – sblundy

9

Hình như sử dụng bí danh union công trình,

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) 

tôi vẫn tò mò nếu có một cách để sử dụng ++ để thay thế.

3

đó làm việc, nhưng sẽ không giành chiến thắng trong "Mã thi Beautiful":

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

Bạn đang chiến thắng cuộc thi mã xấu nhất. – sblundy

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

Hãy xem xét điều này nhưng một mục khác trong cuộc thi mã xấu nhất. ;)

Các vấn đề liên quan