2013-05-02 43 views
5

Tại sao phương pháp ngầm ẩn sau không được áp dụng? Và làm thế nào tôi có thể đạt được để tự động chuyển đổi một thể hiện của X thành một thể hiện của Y trong khi có một phạm vi ngụ ý Conversion[X,Y].Chuyển đổi ngầm định không hoạt động

trait Conversion[X, Y] { 
    def apply(x: X): Y 
} 
implicit object Str2IntConversion extends Conversion[String, Int] { 
    def apply(s: String): Int = s.size 
} 
implicit def convert[X, Y](x: X)(implicit c: Conversion[X, Y]): Y = c(x) 

val s = "Hello" 
val i1: Int = convert(s) 
val i2: Int = s // type mismatch; found: String required: Int 
+1

Đối với dòng cuối cùng để làm việc, bạn cần một chuyển đổi ngầm từ 'chuỗi' cho' Int' , ví dụ 'ngầm [String => Int]' - không tồn tại. Vấn đề ở đây là 'Y' là một tham số, và Scala sẽ không chỉ thay thế cho bất kỳ kiểu nào bạn đang tìm kiếm. Ví dụ, 'implicit def convert [X] (x: X) (ngầm định c: Conversion [X, Int]): Int = c (x)' sẽ hoạt động. –

Trả lời

4

Hãy chuyển đổi của bạn kéo dài Function1, sau đó bạn không cần phương pháp helper nữa:

trait Conversion[X, Y] extends (X => Y) { 
    def apply(x: X): Y 
} 

// unchanged 
implicit object Str2IntConversion extends Conversion[String, Int] { 
    def apply(s: String): Int = s.size 
} 

// removed convert 

// unchanged 
val s = "Hello" 
val i1: Int = convert(s) 
val i2: Int = s 
+1

Ý tưởng hay! Cảm ơn bạn. Nhưng câu hỏi đầu tiên vẫn là: Tại sao mã của tôi không hoạt động? –

+0

@PeterSchmitz có lẽ là do kiểu trả về chung tùy thuộc vào ngầm định. Nếu bạn thay thế 'Y' bằng' Int', mã của bạn hoạt động. – gzm0

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