Scala 类实例化返回一个函数对象
我试图理解,当我创建一个扩展特性的类时,我相信它扩展了Function0[()=>Unit],为什么该类的对象实例化的类型是Function0?在对象实例化期间,apply方法是否作为构造函数调用?我不能完全理解下面代码的机制Scala 类实例化返回一个函数对象,scala,Scala,我试图理解,当我创建一个扩展特性的类时,我相信它扩展了Function0[()=>Unit],为什么该类的对象实例化的类型是Function0?在对象实例化期间,apply方法是否作为构造函数调用?我不能完全理解下面代码的机制 scala> trait Base extends (() => Unit) { | | def label: String | } defined trait Base scala> class Extend extends Base{
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
scala>trait Base扩展(()=>Unit){
|
|def标签:字符串
| }
定义性状库
scala>类扩展扩展基{
|覆盖def label=“你好标签”
|覆盖def apply()=println(“这是应用”)
|
| }
定义类扩展
scala>val m=新扩展
m:扩展=
scala>m()
这是适用的
这个
东西不是类型。这只是Function0
上定义的默认toString
方法的输出。您不会在任何地方重写toString
,因此它使用来自超类的实现。添加像label
这样的方法不会改变任何东西,编译器无法读取(您的想法)
小演示:
scala> val f = new Function0[Int]{ def apply(): Int = 42 }
f: () => Int = <function0>
scala> f.toString
res0: String = <function0>
scala>val f=new Function0[Int]{def apply():Int=42}
f:()=>Int=
scala>f.toString
res0:String=
另一方面,您的示例中的类型正确地显示为Extend
谢谢@Andrey,但我想知道的是,为什么新的Extend
属于函数0的类型,是因为扩展基本函数0
?另外,不是
而是Extend@
来表示类的对象吗?@jjayadeepnew Extend
是Extend
类型。repl正好显示:m:Extend
。因为您刚刚对Function0
进行了子类化,Extend
也恰好是Function0
的子类型,所以我不确定您到底对它感到了什么惊讶?好吧,我得到了它,=表示法是因为toString方法。通常,当我们在REPL中创建新类时,它会给出一个对象引用,如下所示Class@number我相信这是AnyRef的toString方法,但在本例中,它使用函数0中的toString。@jjayadeep它给出的内容某种程度上取决于已经提供的toString
-方法。。。例如,case
-类通常会产生更好的人类可读输出,没有任何散列号等。我认为您刚刚混淆了repl的结果:Type=ToString
-输出中的类型和ToString
部分,但是现在这似乎很清楚了。@jjayadeep…构造函数没有调用apply
。它与构造函数没有任何关系。apply
只是一种常用的方法,只是它有一些语法上的糖分:m()
将其分解为m.apply()
。