Scala 如何调用需要带参数的类型函数的方法

Scala 如何调用需要带参数的类型函数的方法,scala,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 = Func

这是我的代码,当我尝试调用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)=>Promise[String]

实际上您的原始代码(修订版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[对象,对象,对象,对象,
更改为
Function4[对象,对象,对象,单元]


如果您想使用当前代码(修订版2),只需将
Promise[String]
更改为
Unit

为什么您的代码要定义自己的
函数(不描述函数)和自己的
函数4
(如果标准库中有)


如果,正如您对另一个答案的评论所说,“我不能更改我的CallbackFunction中的任何内容,这是一个库代码”,这看起来非常像一个任何人都不应该使用的库

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

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

但这只会使它编译(传递
null
!)也是如此;您想做什么根本不清楚。

调用函数的返回类型是
Promise[String]
,而不是
Unit
。感谢您更正此问题,我在示例中更正了它。您不应该更正错误消息,您应该更正代码;)您的函数返回
Unit
,但它应该返回
Promise[String]
。因此,创建一个而不是只打印文本。你能举个例子说明我该如何做吗?你可以从
Promise
API中获得灵感。假设您的库使用标准的
scala.concurrent.Promise
。我无法更改CallbackFunction中的任何内容,这是一个库代码。我不知道如何使用它,我需要Promise[String],不能使用Unit,因为这不是我的代码。有什么帮助吗?我怎么用?我也在使用Scala 2.12版。1@Taimur假设Promise是
scala.concurrent.Promise
,您可以这样做:defm2={m1((a:Object,b:Object,c:Object,d:Object)=>{println(“这里好!”)Promise.successful(“任意字符串”)//或者如果发生错误,可以返回此//Promise.failed(新运行时异常(“发生错误”))}}如果要返回其他内容,可以浏览
Promise
API。