2

在询问/编辑这个问题时,我注意到您可以这样做以完全静态安全地实现原始“奇怪重复的模板/通用模式”的要点:

trait MyTrait[This <: MyTrait[This]] { this: This =>
  def myBinOp(other: This): This
}

这似乎让您消除了隐式转换和 Scala 的 ad-hoc 类型类模式的主要需求之一,因为 self-type 消除了声明的能力

class A extends MyTrait[Nothing]

和类似的事情,这是我所知道的原始模式的唯一问题。有什么我错过的吗?为什么不是每个人(在 Scala 中)都开始使用它?

4

1 回答 1

1

正如 Daniel C. Sobral 的评论所指出的那样,它实际上不起作用。我不知道为什么我错过了这个,因为事后看来这很明显:

class A extends MyTrait[A] {...} // Linearization:  A, MyTrait[A], AnyRef, Any
class B extends A {...} // Linearization:  B, A, MyTrait[A], AnyRef, Any

最大的问题是它BmyBinOp回报A而不是B.

于 2012-07-01T22:23:16.433 回答