更实用的方式来实例化特征的匿名实现

时间:2016-03-07 13:58:47

标签: scala anonymous-class traits

假设我有一个需要特征实例的函数:

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) = { ... }
}

2 个答案:

答案 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 => {...}))