使用Future
时,我已经看到人们使用
Future{
Thread sleep 500
promise success "You've just completed the promise with me in it!"
}
看看Future
的定义,我可以看到Future是一个特征
但是当我做出自己的特征时,示例:
trait t{}
def main(args: Array[String]): Unit = {
t{
println("Test")
}
}
它不会编译。为什么?
答案 0 :(得分:4)
在编写Future{ /*your code*/ }
时,将调用apply
的伴随对象的Future
方法。
Future
的apply方法的签名如下
def apply[T](body:=>T)
您可以看到,在诸如InteliJ之类的IDE中在apply
上进行ctrl+click
或cmd+click
时,会调用Future
方法。
您的特征t
没有适用。因此,该段代码无法编译。
trait t{}
object t{
apply[T](body:=>T){}
}
答案 1 :(得分:2)
您描述的Future语法来自特质伴侣对象。
该对象具有以下方法:
def apply[T](body: =>T)(implicit @deprecatedName('execctx) executor: ExecutionContext): Future[T] =
unit.map(_ => body)
可接受的参数是返回T的函数,通过您看到的形式(即带括号的代码块)传递它是完全习惯的。
话虽如此,您可以实例化特性(通过创建它们的匿名子类),并通过以下编译:
trait t {}
object MyApp extends App {
new t {
println("Test")
}
}
虽然我不建议将其作为一般的良好做法,但是它有其用途。