1

以下がビューまたはコンテキストにバインドされているかどうかは、実際には明確ではありません。また、自己参照の側面(モデルの再参照)が何をしているのか明確ではありません;):

abstract class Model[M <: Model[M]] extends Transformer {

「<: Model[M]」の意味についての説明をいただければ幸いです。

4

1 に答える 1

2

<:ビューにもコンテキストにもバインドされていませんが、タイプにバインドされています。

以下は、自己参照型境界の使用方法の拡張例です。

このクラスは、メソッドを機能させるためにModelA、より限定的なタイプ バインドを使用します。まだ延長できますが、できません。一方、クラスはタイプ バウンドをさらに制限しないため、拡張できます。メソッドとメソッドは、メソッドとメソッドが呼び出される順序に応じて、バインドされた型またはパラメーターのいずれかを制限します。M <: ModelA[M]fooNModelA2ModelA[ModelA1]ModelA[ModelB1]ModelBModelB2ModelB[ModelA1]bar1bar2modeltransformbarmodel

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 = ???
}
于 2015-02-26T10:11:04.763 に答える