在Scala中扩展匿名类型的目的是什么?
我试图更好地理解Scala,但似乎找不到以下代码的有效用例:在Scala中扩展匿名类型的目的是什么?,scala,anonymous-types,extending,Scala,Anonymous Types,Extending,我试图更好地理解Scala,但似乎找不到以下代码的有效用例: class C extends { def m() { /* ... */ } } 允许这种构造的理由是什么 谢谢 我想这里唯一的理由是“尽可能避免特殊情况”。您可以扩展任何类,匿名类是一个类,因此您可以扩展匿名类。事实上,这不是匿名类!它是一个早期的初始值设定项,它作为构造函数的一部分在其超类之前运行。 引用以下优秀答案: 如果代码改为 class Z extends X { val name = "class Z" }
class C extends { def m() { /* ... */ } }
允许这种构造的理由是什么
谢谢 我想这里唯一的理由是“尽可能避免特殊情况”。您可以扩展任何类,匿名类是一个类,因此您可以扩展匿名类。事实上,这不是匿名类!它是一个早期的初始值设定项,它作为构造函数的一部分在其超类之前运行。 引用以下优秀答案: 如果代码改为
class Z extends X {
val name = "class Z"
}
然后,在初始化Z时会发生空指针异常,因为在正常的初始化顺序(类之前的超类)中,大小在名称之前初始化。调用它,它们处理超类初始化顺序问题。您给出的示例不是结构类型,而是匿名类。这并不能解释为什么你可以扩展它…没错,我更新了标题你可能是对的(+1)。但是,如果确实存在一个用例,我会喜欢它:)我同意Kim的观点,继承允许共享行为或表示给定的层次结构。但是如果父类是匿名的,则不能有两个子类扩展同一父类。不能扩展
final
类。我想匿名类可以被设置为final,但如果没有任何理由扩展匿名类,那么它们是否为final可能没有任何区别。我想提醒用户,这个答案是错误的。几年来,这一直是人们接受的答案,而且它具有误导性,因为它与避免特殊情况无关。见下面我的答案。
class Z extends X {
val name = "class Z"
}