2012-02-04 27 views
8

我很難解釋 附加隱式值通過主隱式值或隱式轉換尋求的行爲差異。具體來說,這個工作:爲什麼Scala無法在這個特定情況下找到次隱式值?

trait Foo[A] 
implicit def fooString: Foo[String] = null 

implicit def value[A](implicit foo: Foo[A]) = 5 

> implicitly[Int] 
5 

但這並不:

implicit def conversion[A](x: Int)(implicit foo: Foo[A]) = new { 
    def aMethod = 5 
} 

> 1.aMethod 
could not find implicit value for parameter foo: test.Foo[A] 

變:

  • 無論搜索是通過implicitly或隱式轉換
  • 開始無論是二級隱價值追求是多態的
  • 是否提供的二次內含價值是多態的

我得到如下結果:

Conversion/value Searching for Supplied | Works? 
---------------- ------------- -------- | ------ 
    conversion  poly   poly | yes 
    conversion  poly   mono | **no** 
    conversion  mono   poly | yes 
    conversion  mono   mono | yes 
    value   poly   poly | yes 
    value   poly   mono | yes 
    value   mono   poly | yes 
    value   mono   mono | yes 

正如你所看到的,不工作的唯一情況是當搜索被隱式轉換開始 ,所尋求的值是多態的,但提供的值是單態的。

是否有一個理論上的原因,爲什麼這應該是這種情況,或者這是一個 錯誤/ Scala的限制?

回答

7

你正在被scalac bug SI-3346咬傷。更一般地參見SI-4699的描述,尤其是,點(1),

1)隱式搜索和隱式轉換搜索治療未定類型參數不同

您是直接觀察您的案件隱含的價值觀和隱式轉換之間的區分。

我已經更新了SI-3346以將其作爲附加示例。

3

更改的隱式轉換的簽名方式如下:

implicit def conversion[A](a: A)(implicit foo: Foo[A]) = new { 

然後調用上類型的值的隱式值被定義爲其中,即amethod方法字符串

scala> "foo".aMethod 
res0: Int = 5 
+1

正確的答案,錯誤的問題;-) – 2012-02-04 14:11:43

相關問題