类实例化返回一个Function对象

时间:2018-03-20 10:52:22

标签: scala

我试图理解何时创建扩展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

1 个答案:

答案 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