假设我有一个需要特征实例的函数:
trait MyTrait[T] {
def f1: T
def f2(t: T): Unit
}
def foo[T](t: MyTrait[T]) { ... }
现在,在我调用此函数的任何地方,我都需要使用以下语法:
val x = foo[String](new MyTrait[String] {
def f1 = "Hello"
def f2(str: String) = { ... }
}
我想知道是否有另一种方法可以实现这一目标,使我的用法更简单,更美观?理想情况下,我希望有以下用法:
val x = foo() {
def f1 = "Hello"
def f2(str: String) = { ... }
}
答案 0 :(得分:3)
如果你像你所描述的那样匿名使用这个特性,那就把它扔掉吧! 而是使函数看起来像
def foo[T](f1: T, f2: T => Unit)
所以你可以像
一样调用它foo("Hello", (myString:String) => { } )
答案 1 :(得分:1)
Nabil A的替代方案答案,如果你想保留这个特性,就是使用一个案例类对其进行子类化,该案例类采用f1
和(一个函数描述)f2
作为参数:
case class MyClass[T](f1: T, _f2: T => Unit) extends MyTrait[T] {
def f2(t: T) = _f2(t)
}
然后,您可以将其实例化为:
foo(MyClass[String]("hello", str => {...}))