假设我有一个抽象类型 AA 和具体类型 XXX:
trait AA {
type A = XXX
final type B = XXX
}
在这种情况下,在 AA 的任何子类中,类型 A 和 B 都不能被覆盖,因此看来关键字final
是完全多余的。这个说法正确吗?
很难证明它们完全相同,但我会说它们是完全相同的,除了一些无用的怪癖。
无用的怪癖
首先也是最明显的是,它们给出了不同的错误消息。但这还不是全部:技术上可以覆盖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 https://stackoverflow.com/a/11274901/2093695对这个问题是否可以覆盖类型字段 https://stackoverflow.com/questions/11274729/is-it-possible-to-override-a-type-field, StackOverflow 用户0__ https://stackoverflow.com/users/515054/0注意到
type T = C
不可避免地修复T
,这相当于制作一个方法final
.
and
您现在可以轻松看出必须禁止进一步“覆盖”T
接下来是一些关于如果您可以覆盖的话类型系统将如何不一致的解释T
到不同的类型。有关详细信息,请参阅该答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)