如何在具有多个参数列表的函数中覆盖 'apply'?
How to override 'apply' in a Function with multiple parameter lists?
我正在尝试创建此类函数对象的实例:
trait CanGetSiblingDock[S, D]
extends (D => String => S => Option[D])
有了这个:
implicit val getSiblingDock = new CanGetSiblingDock[Situation, Dock] {
def apply(dock: Dock)(siblingName: String)(sit: Situation): Option[Dock] = ???
}
编译器对象:
error: object creation impossible, since method apply in trait Function1 of type (v1: FARG.Dock)String => (TestFARGModel4.this.Situation => Option[FARG.Dock]) is not defined
(Note that T1 does not match FARG.Dock)
implicit val getSiblingDock = new CanGetSiblingDock[Situation, Dock] {
^
如果我理解正确,编译器会抱怨 apply
的第一个参数不是 Dock
类型。不过在我看来,确实如此。
显然,我在某处误解了一些东西。您如何正确创建具有多个参数列表的函数实例?
类似于:
scala> trait F extends (String => Int => Int)
defined trait F
scala> object X extends F { def apply(s: String): Int => Int = ??? }
defined object X
类型 A => B => C
不是 Function2[A, B, C]
,apply
方法将是 def apply(a: A, b: B): C
。但这是 Function1[A, Function1[B, C]]
,就像柯里化函数。如果你想要 Function2
,你必须写:
trait Foo extends Function2[Int, String, Boolean] {
override def apply(a: Int, b: String): Boolean = ???
}
如果现在需要多个参数列表,则必须重载 apply
:
trait Foo extends Function2[Int, String, Boolean] {
override def apply(a: Int, b: String): Boolean = ???
def apply(a: Int)(b: String): Boolean = apply(a, b)
}
这是不可能的,因为在擦除之后,这两种方法在字节码级别上看起来是一样的。
我正在尝试创建此类函数对象的实例:
trait CanGetSiblingDock[S, D]
extends (D => String => S => Option[D])
有了这个:
implicit val getSiblingDock = new CanGetSiblingDock[Situation, Dock] {
def apply(dock: Dock)(siblingName: String)(sit: Situation): Option[Dock] = ???
}
编译器对象:
error: object creation impossible, since method apply in trait Function1 of type (v1: FARG.Dock)String => (TestFARGModel4.this.Situation => Option[FARG.Dock]) is not defined
(Note that T1 does not match FARG.Dock)
implicit val getSiblingDock = new CanGetSiblingDock[Situation, Dock] {
^
如果我理解正确,编译器会抱怨 apply
的第一个参数不是 Dock
类型。不过在我看来,确实如此。
显然,我在某处误解了一些东西。您如何正确创建具有多个参数列表的函数实例?
类似于:
scala> trait F extends (String => Int => Int)
defined trait F
scala> object X extends F { def apply(s: String): Int => Int = ??? }
defined object X
类型 A => B => C
不是 Function2[A, B, C]
,apply
方法将是 def apply(a: A, b: B): C
。但这是 Function1[A, Function1[B, C]]
,就像柯里化函数。如果你想要 Function2
,你必须写:
trait Foo extends Function2[Int, String, Boolean] {
override def apply(a: Int, b: String): Boolean = ???
}
如果现在需要多个参数列表,则必须重载 apply
:
trait Foo extends Function2[Int, String, Boolean] {
override def apply(a: Int, b: String): Boolean = ???
def apply(a: Int)(b: String): Boolean = apply(a, b)
}
这是不可能的,因为在擦除之后,这两种方法在字节码级别上看起来是一样的。