2009-12-11 20 views
19

Giả sử tôi có điều này:Có cách nào để kiểm soát chuyển đổi ngầm định nào sẽ được sử dụng mặc định?

class String2(val x:String) { 
    def *(times:Int) : String = { 
     val builder = new StringBuilder() 
     for(i <- 0 until times) { 
      builder.append(x) 
     } 
     builder.toString() 
    } 
} 

bây giờ nếu tôi thêm ngầm này:

implicit def gimmeString2(y:String) = new String2(y) 

tôi sẽ nhận được một lỗi biên dịch vì stringWrapper cũng cho biết thêm tiềm ẩn này. Có cách nào để nói với trình biên dịch "bỏ qua implicits khác, sử dụng này", để tôi không phải nhanh chóng một đối tượng String2 và làm việc trên đó?

Tôi thừa nhận mã ví dụ có thể không phù hợp nhất (đối với câu hỏi này), nhưng tôi nghĩ nó sẽ làm.

+0

có thể trùng lặp: http://stackoverflow.com/questions/1339148/avoiding-implicit-def-ambiguity-in-scala –

+0

Tôi không nghĩ rằng đó là một bản sao. Tác giả của câu hỏi đó muốn giữ lại cả hai điều này. Tôi chỉ muốn một. – Geo

+0

Có một phương pháp rất giống nhau, nếu không giống hệt nhau, ở trên đã có sẵn trong RichString. Nếu bạn muốn phương thức của bạn được sử dụng, có lẽ bạn có thể sử dụng kỹ thuật import a.b. {c => _} để ẩn c trong đó c là tên phương thức ngầm. –

Trả lời

29

Scala 2.8 đã thêm hệ thống ưu tiên cho các vi phạm. Nó giải thích trong SIP on the new Java arrays này:

Khi so sánh hai phương án được áp dụng khác nhau của một phương pháp quá tải hoặc của một ngầm, mỗi phương pháp được một điểm cho có lập luận cụ thể hơn, và một điểm để được định nghĩa trong một lớp con thích hợp. Một thay thế “chiến thắng” hơn người khác nếu nó được một số lượng lớn các điểm trong hai so sánh những

kết luận rằng nếu lựa chọn thay thế có loại đối số giống hệt nhau, là được định nghĩa trong một lớp con thắng. Do đó tôi tin rằng bạn có thể tuyên bố implicits như sau:

trait LowPriorityImplicits { 
    //lower priority conversions 
} 

object HighPriorityImplicits extends LowPriorityImplicits { 
    //higher-order ones here 
} 
Các vấn đề liên quan