简化示例:
class Factory(x : Int) {
def apply(y : Int)(z : Int) : Int = x + y + z
}
class Sample {
def get[B <% Int](x : B) = new Factory(x)
}
val s = new Sample
我想要的是:s.get(2)(3)(4)
应输出9
。我得到了什么
error: type mismatch;
found : Int(3)
required: Int => Int
s.get(2)(3)(4)
^
完全正确,编译器失败了。第二个参数列表应包含隐式转换,但省略。因此出现了错误。
问题是如何让编译器知道应该执行隐式解析。
我尝试过的东西不起作用:
s.get(2)()(3)(4)
{s get 2}(3)(4)
(s get 2)(3)(4)
((s get 2))(3)(4)
显式方式有效,但它需要两行而不是一行:
val b = s get 2
b(3)(4)
我还可以明确使用apply
方法:s.get(2).apply(3)(4)
但它看起来很难看。
如何让编译器在表达式中执行隐式解析?
答案 0 :(得分:1)
您可以使用显式类型ascription
val nine = (s.get(2): Factory)(3)(4)
或者,如果您发现这样不方便,请构建您自己的控制结构以强制进行类型推断:
def infer[X](z: => X): X = z
val nineAgain = infer(s get 2)(3)(4)
答案 1 :(得分:0)
s.get(2)(implicitly)(3)(4)
(implicitly
只是Predef
中定义的方法:def implicitly[A](implicit x: A) = x
。)