明确提供隐式参数

时间:2018-11-22 11:59:09

标签: scala

我有这样的功能:

case class SomeCaseClass(i: Int)

def func[T: Manifest](someArg: Int)(implicit i: String) = {
  SomeCaseClass(2)
}

我需要打电话给func,并提供i 明确

但是当我致电func[SomeCaseClass](2)("hello")时,我得到了:

  

错误:方法func的参数不足:(隐式证据$ 1:   清单[ScalaFiddle.this.SomeCaseClass],隐式i:   String)ScalaFiddle.this.SomeCaseClass。未指定的值参数i。   funcSomeCaseClass(“ hello”)

在不更改函数签名的情况下可以做到这一点吗?

2 个答案:

答案 0 :(得分:3)

如果提供任何隐式参数,则需要显式地提供 all ,并且T: Manifest表示还有一个附加的隐式参数。

很高兴,implicitly method将召唤编译器本应提供的隐式:

func[SomeCaseClass](2)(implicitly, "hello") // inferred to implicitly[Manifest[SomeCaseClass]]

答案 1 :(得分:0)

当我在scala REPL中定义方法func时,我发现输出为:

func: [T](someArg: Int)(implicit evidence$1: Manifest[T], implicit i: String)SomeCaseClass

换句话说,相同的代码也可以写成:

def func1[T](someArg: Int)(implicit manifest: Manifest[T], i: String) = {
  SomeCaseClass(2)
}

也描述了here

因此在上面的代码中,我们可以看到implicit部分现在有两个参数,而不是唯一的String。并且,您需要提供implicit部分的所有参数,以备显式填充。如果只提供一个,则会引发编译错误。

因此,可以通过以下代码调用方法func

func(2)(Manifest.classType(classOf[SomeCaseClass]), "hello")