最近,我查看了implicit chain,implicit def foo[C3 <% C](c: C)
的示例。我认为我对&lt;%和(隐式c:C)之间的区别感到困惑。
如果我写隐式def bToC [C3&lt;:C](c:C)(隐式c3:C3),它会给出一个编译错误,但为什么这样,隐式def应该在范围内?
修改
有人可以解释原因吗
implicit def aToB[A1 : A](a: A1)(implicit ev: Int => A1): B = new B(a.n, a.n)
和
implicit def aToB[A1 <: A](a: A1)(implicit ev: Int => A1): B = new B(a.n, a.n)
不工作?
非常感谢提前
答案 0 :(得分:1)
[C3 <% C]
表示implicit ev: C3 => C
。换句话说,是一个将C3
转换为C
的隐式函数。因此,范围中的所有C3
个对象都可以是C
个对象。
def intPlus1[A <% Int](a: A) = a + 1
// def intPlus1[A](a: A)(implicit ev: A => Int) = a + 1
implicit def string2int(s: String) = s.toInt // String => Int
intPlus1("100")
intPlus1("100")(string2int)
// the result bark bark
请注意,A <% A
适用于任何A
,因为隐式函数A => A
为Predef
',因此B <% A
如果B <: A
,正如@rightfold在评论中提到的那样。 :)