11

我试图更好地理解 Scala,但我似乎无法找到如下代码的有效用例:

class C extends { def m() { /* ... */ } }

允许这种结构的理由是什么?

谢谢!

4

3 回答 3

12

我想这里唯一的理由是“尽可能避免特殊情况”。你可以扩展任何类,匿名类就是一个类,所以你可以扩展一个匿名类。

于 2011-09-28T08:11:33.450 回答
11

事实上,这不是一个匿名类!它是一个早期的初始化器,它作为构造函数的一部分运行在它的超类之前。引用另一个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 之前初始化的(超类在类之前)。

于 2012-10-08T22:01:45.083 回答
1

它被称为早期定义,它们处理超类初始化顺序问题。

于 2014-04-26T17:40:20.053 回答