如何在应用链

时间:2016-09-29 00:40:12

标签: scala implicit

简化示例:

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)但它看起来很难看。

如何让编译器在表达式中执行隐式解析?

2 个答案:

答案 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。)