我试图理解何时创建扩展Trait的Class,我相信它扩展了Function0 [()=>单位]为什么该类的对象的实例化是Function0类型?在对象实例化期间是否将apply方法作为构造函数调用?我无法完全理解下面代码的机制。
scala> trait Base extends (() => Unit) {
|
| def label: String
| }
defined trait Base
scala> class Extend extends Base{
| override def label = "Hello label"
| override def apply()= println ("This is apply")
|
| }
defined class Extend
scala> val m = new Extend
m: Extend = <function0>
scala> m()
This is apply
答案 0 :(得分:2)
<function0>
- 事物不是那种类型。这只是toString
上定义的默认Function0
方法的输出。您不能在任何地方覆盖toString
,因此它使用超类中的实现。添加像label
这样的方法并没有改变任何东西,编译器无法读取(你的想法)。
小演示:
scala> val f = new Function0[Int]{ def apply(): Int = 42 }
f: () => Int = <function0>
scala> f.toString
res0: String = <function0>
另一方面,示例中的类型正确显示为Extend
。