【问题标题】:Calling method with an implicit parameter使用隐式参数调用方法
【发布时间】:2016-12-23 03:58:44
【问题描述】:

我有以下方法:

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

它实际上是如何工作的?

【问题讨论】:

    标签: scala function implicit


    【解决方案1】:

    首先,我认为我们可以省略隐式参数而只指定显式参数。

    您要么指定列表中的所有隐式,要么根本不指定它们。 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) 
    

    【讨论】:

    • +up 供规范参考。
    【解决方案2】:

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

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

    试试看!

    【讨论】:

    • 嗯...那么我问题中的声明是什么意思?编译器是怎么解释的?
    • 这只是意味着 ev 和 t 参数都被认为是隐式的。这就是为什么编译器声明 t 是隐式的。
    • 所以如果我们想要声明多个隐式参数,我们可以省略多次写入隐式。对吗?
    • 是的,这是正确的,而且在参数列表的开头只使用一个“隐式”是定义隐式参数列表的正常方法。
    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多