Scala隐式方法参数

Scala隐式方法参数,scala,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: erro

在下面的代码段中:

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> 
scala>A类
定义的A类
scala>类B扩展了
定义的B类
scala>deft(b:b)(隐式a:a)=println(a)
t:(b:b)(隐式a:a)单位
scala>val b=新b
b:b=B@7746d2
scala>t(b)
:12:错误:找不到参数a:a的隐式值
t(b)
^
scala>val c=新的B
c:B=B@4fa2e041
scala>t(b)
:12:错误:找不到参数a:a的隐式值
t(b)
^
斯卡拉>

子类型在作用域中,为什么编译失败?

您需要将
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
scala>val b=new b
b:b=B@38cccef
scala>t(b)
:12:错误:找不到参数a:a的隐式值
t(b)
^
scala>隐式val c=新B
c:B=B@6d00a15d
scala>t(b)
$line4.$read$$iw$$iw$B@6d00a15d

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

隐式val a=新a


然后您的
t(b)
应该可以工作。

val b=new b
在范围内,但不是隐式的。所以,让它含蓄。