我有以下方法:
def test[T](implicit ev: T <:< Int, t : T) = println(t)
我怎么称呼它?我试过了
test(10)
但编译器会输出以下错误:
Error:(19, 9) not enough arguments for method test: (implicit ev: <:<[T,Int], implicit t: T)Unit.
Unspecified value parameter t.
test(10)
^
首先,我认为我们可以省略隐式参数并仅指定显式参数。其次,为什么它说参数t
是隐含的?
implicit t: T
它是如何运作的?
答案 0 :(得分:4)
首先,我认为我们可以省略隐式参数并仅指定显式参数。
您可以指定列表中的所有含义,也可以不指定它们。 According to the specification,如果一个参数被标记为隐式,则整个参数列表也被标记:
方法的隐式参数列表(
implicit p1, ……, pn
)将参数p1, …, pn
标记为隐式。
其次,为什么它说参数t是隐含的?
由于你的第一部分已经回答了什么。
如果您仍想这样调用它,可以使用implicitly
:
test(implicitly, 10)
通常,建议您在单独的参数列表中需要隐式:
def test[T](i: Int)(implicit ev: T <:< Int) = println(t)
答案 1 :(得分:3)
问题是隐式参数应该在它自己的列表中,如下所示:
def test[T](t : T)(implicit ev: T <:< Int) = println(t)
试一试!