【发布时间】:2019-04-22 21:36:26
【问题描述】:
我最近发现 Scala 编译器对 case class 有一个有趣的特性:由于它同时生成类和对象签名,如果定义为内部类,它可以用来覆盖抽象类型定义和函数定义它的超类具有最少的样板代码,这里是一个例子:
object InnerCaseClassOverridingBoth {
trait AALike
trait SS {
type AA <: AALike
def AA(): AnyRef
}
trait SS_Clear extends SS {
def AA(): AnyRef
}
class SSA extends SS_Clear {
case class AA() extends AALike
}
object SSA extends SSA {}
}
这将编译没有任何错误。然而快捷方式在这里停止,如果函数定义def AA被参数化,那么内部案例类和内部对象都不能覆盖它:内部对象的apply函数不会自动扩展为它的方法外部类:
trait SS_Parameterised extends SS {
def AA(ii: Int): AnyRef
}
class SSB extends SS_Parameterised {
case class AA(ii: Int) extends AALike
}
object SSB extends SSB {}
这给出了一个错误:
class SSB needs to be abstract, since method AA in trait
SS_Parameterised of type (ii: Int)AnyRef is not defined
class SSB extends SS_Parameterised {
我的问题是,在这种情况下是否有捷径?为什么 Scala 编译器设计为链接 case 1 而不是 case 2?
【问题讨论】:
标签: scala inheritance overriding case-class