我正在努力更好地理解Scala,而且我似乎无法为以下代码找到有效的用例:
class C extends { def m() { /* ... */ } }
允许这种结构的理由是什么?
谢谢!
答案 0 :(得分:12)
我想这里唯一的理由就是“尽可能避免特殊情况”。你可以扩展任何类,匿名类是一个类,所以你可以扩展一个匿名类。
答案 1 :(得分:11)
事实上,这不是一个匿名的课程!它是一个早期的初始化程序,它作为超类之前的构造函数的一部分运行。 引用another stackoverflow question的优秀答案:
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初始化时会发生空指针异常,因为在初始化的正常排序(类之前的超类)中,name在name之前初始化。
答案 2 :(得分:1)
它被称为Early definitions,它们处理超类初始化顺序问题。