实现抽象方法时函数类型不匹配

Function type mismatch when implementing abstract method

我是 Scala 的新手,不幸的是我被困在这个问题上。

我在 Types.Subscribe 中定义了一个函数类型,我想按如下方式重用它:

object Types {
  type Subscribe[T] = (T => T)
}

trait Adapter[T] {
  def subscribe: Types.Subscribe[T]
}

class IntAdapter extends Adapter[Int] {
  def map(subscribe: Types.Subscribe[Int]) = { 1 }
  def subscribe(value: Int): Int = { 2 }
}

但是,我从 IntelliJ 收到以下错误:

Class FooAdapter must either be declared abstract or implement abstract member 'subscribe: Types.Subscribe[T]'

好像def subscribe(value: Int): Int和函数类型(Int => Int)不匹配,有点乱。如果是这种情况,我如何定义一个我可以如上所述重用的订阅函数类型?

我尝试使用 apply 方法定义函数类型:

trait StreamSubscribe[T] {
  def apply(value: T): T
}

但是,我也无法让它工作。

我想为订阅方法的类型签名提供单一真实来源,而不是在随机的地方重复它。我怎样才能做到这一点?

我认为您可能混淆了两个概念 class 函数(又名方法)和匿名函数。虽然在核心上两者都只是函数,但您无法按照您想要的方式定义 class 函数,但您 可以 按预期使用它。

不确定您将如何使用该功能,但我相信这就是您要找的...

object Types {
  type Subscribe[T] = (T => T)
}

trait Adapter[T] {
  /**
    *
    * @return a function which takes a [[T]] and returns a [[T]]
    */
  // def subscribe: Types.Subscribe[T]

  /**
    * @param value a [[T]]
    * @return a [[T]]
    */
  def subscribe(value: T): T
}

class IntAdapter extends Adapter[Int] {
  def map(subscribe: Types.Subscribe[Int]) = {
    subscribe(1)
  }

  def subscribe(value: Int): Int = {
    value + 2
  }
}

val adapter = new IntAdapter()
adapter.map(adapter.subscribe) // returns 3

您的 Adapter.subscribe 是 "parameterless method type",结果 Subscribe[T],或 => Subscribe[T]=> T => T

这没什么不寻常的,但是您的 IntAdapter.subscribe 接受参数,Int => Int,并且不会覆盖。

你可以这样做:

scala> object X { type F[A] = A => A }
defined object X

scala> trait T[A] { def f: X.F[A] }
defined trait T

scala> class TI extends T[Int] { def fImpl(i: Int) = 2 * i ; def f = fImpl }
defined class TI

scala> new TI().f(42)
res0: Int = 84

其中 fImpl 变为 (i: Int) => fImpl(i)

或使用方便的符号:

scala> class TI extends T[Int] { def f = 2 * _ }
defined class TI