使用隐式参数调用方法

Calling method with an implicit parameter

我有以下方法:

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

它实际上是如何工作的?

问题是隐式参数应该在它自己的列表中,像这样:

def test[T](t : T)(implicit ev: T <:< Int) = println(t) 

试试吧!

First of all, I thought that we could just omit implicit parameters and specify only explicit ones.

您要么指定列表中的所有隐含项,要么根本不指定它们。 According to the specification,如果一个参数被标记为隐式,则整个参数列表也被标记:

An implicit parameter list (implicit p1, ……, pn) of a method marks the parameters p1, …, pn as implicit.


secondly, why does it's saying that that the parameter t is implicit?

因为你在第一部分的回答。

如果你还想那样调用它,你可以使用implicitly:

test(implicitly, 10)

一般情况下,建议您在单独的参数列表中要求隐式:

def test[T](i: Int)(implicit ev: T <:< Int) = println(t)