以下がビューまたはコンテキストにバインドされているかどうかは、実際には明確ではありません。また、自己参照の側面(モデルの再参照)が何をしているのか明確ではありません;):
abstract class Model[M <: Model[M]] extends Transformer {
「<: Model[M]」の意味についての説明をいただければ幸いです。
以下がビューまたはコンテキストにバインドされているかどうかは、実際には明確ではありません。また、自己参照の側面(モデルの再参照)が何をしているのか明確ではありません;):
abstract class Model[M <: Model[M]] extends Transformer {
「<: Model[M]」の意味についての説明をいただければ幸いです。
<:
ビューにもコンテキストにもバインドされていませんが、タイプにバインドされています。
以下は、自己参照型境界の使用方法の拡張例です。
このクラスは、メソッドを機能させるためにModelA
、より限定的なタイプ バインドを使用します。まだ延長できますが、できません。一方、クラスはタイプ バウンドをさらに制限しないため、拡張できます。メソッドとメソッドは、メソッドとメソッドが呼び出される順序に応じて、バインドされた型またはパラメーターのいずれかを制限します。M <: ModelA[M]
fooN
ModelA2
ModelA[ModelA1]
ModelA[ModelB1]
ModelB
ModelB2
ModelB[ModelA1]
bar1
bar2
model
transform
bar
model
object Main extends App {
val a: ModelA1 = foo(new ModelA1(), 2)
val b: ModelA1 = foo(new ModelA2(), 3)
val c: ModelB1 = bar1(new ModelB1())
val d: ModelA1 = bar2(new ModelB2())
def foo[M <: ModelA[M]](model: Model[M], n: Int): M = model.transform.fooN(n)
def bar1[M <: ModelB[M]](model: Model[M]): M = model.transform.bar
def bar2[M <: Model[M]](model: ModelB[M]): M = model.bar.transform
}
abstract class Model[M <: Model[M]] {
def transform: M
}
abstract class ModelA[M <: ModelA[M]] extends Model[M] {
def foo: M
def fooN(n: Int): M = {
var x: M = this.foo
for (_ <- 2 to n)
x = x.foo
x
}
}
abstract class ModelB[M <: Model[M]] extends Model[M] {
def bar: M
}
class ModelA1 extends ModelA[ModelA1] {
override def transform: ModelA1 = ???
override def foo: ModelA1 = ???
}
class ModelA2 extends ModelA[ModelA1] {
override def transform: ModelA1 = ???
override def foo: ModelA1 = ???
}
class ModelB1 extends ModelB[ModelB1] {
override def transform: ModelB1 = ???
override def bar: ModelB1 = ???
}
class ModelB2 extends ModelB[ModelA1] {
override def transform: ModelA1 = ???
override def bar: ModelA1 = ???
}