2013-11-21 38 views
1

假設代碼:如何控制應用於方法參數的隱式轉換的優先級?

class A 
class B 

class Something { 
    def method(arg: A) = ??? 
    def method(arg: B) = ??? 
} 

class C 

object C { 
    implicit def ctoa(c: C): A = ??? 
    implicit def ctob(c: C): B = ??? 
} 

此外:

  • ABSomething及其同伴不能被修改
  • 必須有一個隱式轉換從CA和從CB ,它們的優先順序並不重要
  • 其他重要的是,類C和它的同伴可以隨意修改
  • 當然,更多類型,implicits等可以添加

現在,有沒有辦法讓這個編譯:

(new Something).method(new C) 

回答

2

我知道這不是你正在尋找的東西,但我沒有看到任何辦法去做,除非把這些暗示中的一個帶入另一個範圍。

class A 
class B 

class Something { 
    def method(arg: A) = println("method(A)") 
    def method(arg: B) = println("method(B)") 
} 

class C 

object C { 
    implicit def ctoa(c: C): A = new A 
} 

object X { 
    implicit def ctob(c: C): B = new B 
} 

然後你得到:

scala> (new Something).method(new C) 
method(A) 

否則,你要違背明確性規則:「如果沒有其他可能的轉換插入的隱式轉換隻能插入」。見Programming in Scala

+0

有一種方法在不確定性的情況下,控制隱式轉換的優先級(例如,通過將低優先級implicits成超/性狀),但我不知道爲什麼它不會在這種情況下工作。 – ghik

+0

你的超類/特質事物的來源是什麼? Daniel Sobral寫了一篇關於隱含優先級的文章。 http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits C.ctoa和C.ctob在同一個編譯單元,所以我覺得由丹尼爾·唐描述的優先羣體發揮作用。 –

+0

http://stackoverflow.com/questions/1886953/is-there-a-way-to-control-which-implicit-conversion-will-be-the-default-used – ghik