Scala:“类型A = XXX”和“最终类型A = XX”之间的区别?

时间:2019-03-13 21:54:43

标签: scala inheritance polymorphism abstract-type

假设我有一个抽象类型AA和一个具体类型XXX:

trait AA {
  type A = XXX
  final type B = XXX
}

在这种情况下,在AA的任何子类中,都不能覆盖类型A和B,因此看来关键字final是完全多余的。这句话正确吗?

1 个答案:

答案 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覆盖为另一种类型,类型系统将如何不一致的一些说明。有关详细信息,请参见该答案。