Scala隐式方法参数

时间:2015-05-15 19:46:47

标签: scala

在下面的代码段中:

scala> class A
defined class A

scala> class B extends A
defined class B

scala> def t(b: B)(implicit a: A) = println(a)
t: (b: B)(implicit a: A)Unit

scala> val b = new B
b: B = B@7746d2

scala> t(b)
<console>:12: error: could not find implicit value for parameter a: A
              t(b)
               ^

scala> val c = new B
c: B = B@4fa2e041

scala> t(b)
<console>:12: error: could not find implicit value for parameter a: A
              t(b)
               ^

scala> 

子类型在范围内,为什么编译失败?

2 个答案:

答案 0 :(得分:3)

您需要将val声明为implicit才能在隐式参数中使用:

scala> val b = new B
b: B = B@38cccef

scala> t(b)
<console>:12: error: could not find implicit value for parameter a: A
              t(b)
               ^

scala> implicit val c = new B
c: B = B@6d00a15d

scala> t(b)
$line4.$read$$iw$$iw$B@6d00a15d

答案 1 :(得分:0)

您必须声明A类型的隐式值(或B,因为B扩展A)。

implicit val a = new A

然后您的t(b)应该有效。