【问题标题】:Function type mismatch when implementing abstract method实现抽象方法时函数类型不匹配
【发布时间】:2016-07-16 00:25:26
【问题描述】:

我是 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 收到以下错误:

类 FooAdapter 必须声明为抽象或实现 抽象成员'订阅:Types.Subscribe[T]'

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

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

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

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

我希望订阅方法的类型签名有一个单一的事实来源,而不是在随机的地方重复它。我怎样才能做到这一点?

【问题讨论】:

  • 你的特征Adapterdef subscribe,你的IntAdapterdef subscribe(value: Int)。注意到有什么不同吗?

标签: scala function abstract traits


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您的Adapter.subscribe 是“无参数方法类型”,结果为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
    

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 2020-02-04
      • 1970-01-01
      • 2016-11-08
      相关资源
      最近更新 更多