使用隐式参数调用方法

时间:2016-08-16 17:01:44

标签: scala function implicit

我有以下方法:

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

它是如何运作的?

2 个答案:

答案 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) 

试一试!