在下面的代码段中:
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>
子类型在范围内,为什么编译失败?
答案 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)
应该有效。