如何调用需要带参数的Type函数的方法

时间:2017-06-11 08:32:13

标签: scala

这是我的代码,当我尝试调用m1方法时出现以下错误:

trait Function4[-T1, -T2, -T3, -T4, +R] extends Function {
  def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4): R
}

class Function(args: String*) extends Object {

}

class A extends Object {

  type CallbackFunction = Function4[Object, Object, Object, Object, Promise[String]]

  def m1(callback: CallbackFunction): Unit = {

  }

  def m2 = {
    m1(
      (a:Object, b:Object, c:Object, d: Object) => {
        println("good here!")
      }
    )
  }
}

错误是: 类型不匹配,预期:A.this.CallbackFunction,actual:(Object,Object,Object,Object)=>无极[字符串]

2 个答案:

答案 0 :(得分:0)

实际上你的原始代码(修订版1)在Scala 2.12中运行正常,在Scala 2.11中不起作用。

如果您希望在Scala 2.11中编写代码,可以像这样重写代码:

class A extends Object {

  type CallbackFunction[A] = Function4[Object, Object, Object, Object, A]

  def m1[A](callback: CallbackFunction[A]): Unit = {

  }

  def m2 = {
    m1(
      (a:Object, b:Object, c:Object, d: Object) => {
        println("good here!")
      }
    )
  }
}

或者将Function4[Object, Object, Object, Object, _]更改为Function4[Object, Object, Object, Object, Unit]

如果您希望当前代码(修订版2)有效,则只需将Promise[String]更改为Unit

答案 1 :(得分:0)

为什么您的代码定义了您自己的Function(不描述函数)和您自己的Function4(当标准库中有一个时)?

如果你对另一个答案的评论说:“我无法改变我的CallbackFunction中的任何内容,这是一个库代码”,这看起来就像一个没有人应该使用的库。

但是,直接回答您的问题是您传递给m1的参数必须是返回Promise[String]的函数。假设Promise是标准scala.concurrent.Promise而不是库定义的另一种类型,一种可能性是

  (a:Object, b:Object, c:Object, d: Object) => Promise()

但那只会让它编译(所以会传递null!);完全不清楚你想要做什么