2

この質問を尋ねたり編集したりしているときに、元の「不思議なことに繰り返されるテンプレート/ジェネリックパターン」のポイントを完全に静的な安全性で達成するためにこれを行うことができることに気付きました:

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

これにより、暗黙的な変換と Scala のアドホックな型クラス パターンの主要なニーズの 1 つを取り除くことができるように思われます。

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

これに関する大きな問題は、Bの代わりに がmyBinOp返されることです。AB

于 2012-07-01T22:23:16.433 に答える