我有这样的功能:
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”)
在不更改函数签名的情况下可以做到这一点吗?
答案 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")