次の F-bounded ポリモーフィズムを Scala で記述できません。なんで?
trait X[T <: X[T]]
object Y extends X[Y]
これを表現してコンパイルするにはどうすればよいですか?
次の F-bounded ポリモーフィズムを Scala で記述できません。なんで?
trait X[T <: X[T]]
object Y extends X[Y]
これを表現してコンパイルするにはどうすればよいですか?
本当はあなたが書けるはずのように思えますが、
trait X[T <: X[T]]
object Y extends X[Y.type]
ただし、コンパイラが役に立たない (そして私は間違っていると思います) エラーを返すことを試みると、
scala> object Y extends X[Y.type]
<console>:16: error: illegal cyclic reference involving object Y
object Y extends X[Y.type]
「スプリアス」と言うのは、インフラストラクチャを少し追加するだけで同等のオブジェクトを構築できるからです。
trait X[T <: X[T]]
trait Fix { type Ytype >: Y.type <: Y.type; object Y extends X[Ytype] }
object Fix extends Fix { type Ytype = Y.type }
import Fix.Y
これを実際のコードで試してみたい場合は、代わりにパッケージ オブジェクトを使用するobject Fix
と、このイディオムがもう少し使いやすくなります。