假设我有一个抽象类型AA和一个具体类型XXX:
trait AA {
type A = XXX
final type B = XXX
}
在这种情况下,在AA的任何子类中,都不能覆盖类型A和B,因此看来关键字final
是完全多余的。这句话正确吗?
答案 0 :(得分:7)
很难证明它们是完全相同的,但是我要证明它们是,减去了一些无用的怪癖。
首先也是最明显的是,它们给出不同的错误消息。但这还不是全部:在技术上可以覆盖A
,您只能将其覆盖到XXX
之外的其他位置:
trait A1 extends AA {
override type A = XXX // Compiles, but doesn't really do anything.
}
另一方面,您将无法覆盖B
:
trait A2 extends AA {
override type B = XXX // Does not compile.
}
再次,我要争论的是没有。在问题answer的非常详细的Is it possible to override a type field中,StackOverflow用户0__指出了
type T = C
不可避免地修复了T
,这与制作方法final
相对应。
和
您现在可以轻松地看到必须禁止它进一步“覆盖”
T
接下来是有关如果您可以将T
覆盖为另一种类型,类型系统将如何不一致的一些说明。有关详细信息,请参见该答案。