实现抽象方法时函数类型不匹配
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
我是 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