Scala 一种更美观的方法来实例化trait的匿名实现
假设我有一个函数需要一个trait实例:Scala 一种更美观的方法来实例化trait的匿名实现,scala,anonymous-class,traits,Scala,Anonymous Class,Traits,假设我有一个函数需要一个trait实例: 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) = { ... } } 我想知道是否有其他方法可以让我的
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) = { ... }
}
如果你在任何地方都像你描述的那样使用这种特性,扔掉它
而是使函数看起来像
def foo[T](f1: T, f2: T => Unit)
所以你可以这样称呼它
foo("Hello", (myString:String) => { } )
如果你在任何地方都像你描述的那样使用这种特性,扔掉它
而是使函数看起来像
def foo[T](f1: T, f2: T => Unit)
所以你可以这样称呼它
foo("Hello", (myString:String) => { } )
如果你想保留这个特征,Nabil A.回答的另一个选择是使用一个case类对其进行子类化,该类将
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 => {...}))
如果你想保留这个特征,Nabil A.回答的另一个选择是使用一个case类对其进行子类化,该类将
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 => {...}))
还请注意,调用时不需要指定
foo[t]
的类型参数,因为这将从传入的MyTrait
实例的类型参数中推断出来。还请注意,调用时不需要指定foo[t]
的类型参数,因为这将从您传入的MyTrait
实例的类型参数中推断出来。您在这里展示的代码示例是用哪种编程语言编译的?抱歉,是匆忙完成的:(更正;)您在这里展示的代码示例是用哪种编程语言编译的?抱歉,是匆忙完成的:(更正;)