我试图更好地理解 Scala,但我似乎无法找到如下代码的有效用例:
class C extends { def m() { /* ... */ } }
允许这种结构的理由是什么?
谢谢!
我试图更好地理解 Scala,但我似乎无法找到如下代码的有效用例:
class C extends { def m() { /* ... */ } }
允许这种结构的理由是什么?
谢谢!
我想这里唯一的理由是“尽可能避免特殊情况”。你可以扩展任何类,匿名类就是一个类,所以你可以扩展一个匿名类。
事实上,这不是一个匿名类!它是一个早期的初始化器,它作为构造函数的一部分运行在它的超类之前。引用另一个stackoverflow问题的优秀答案:
abstract class X {
val name: String
val size = name.size
}
class Y extends {
val name = "class Y"
} with X
如果代码被写成
class Z extends X {
val name = "class Z"
}
那么当 Z 初始化时会发生空指针异常,因为在正常的初始化顺序中 size 是在 name 之前初始化的(超类在类之前)。
它被称为早期定义,它们处理超类初始化顺序问题。