【问题标题】:Self referential View/Context bound自引用视图/上下文绑定
【发布时间】:2015-04-28 06:43:32
【问题描述】:

我实际上并不清楚以下是视图还是上下文绑定。也不清楚自引用方面(重新引用模型)在做什么;):

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

请解释一下“<: model>

【问题讨论】:

  • 那么问题是什么?
  • @AlexeyRomanov OP 更新
  • 一般上类型边界在here中解释。您想要一些理论背景或更详细的自我参照方面的例子吗?

标签: scala context-bound


【解决方案1】:

&lt;: 既不是视图也不是上下文绑定,而是类型绑定。

下面是如何使用自引用类型边界的扩展示例。

ModelA 类使用更严格的类型绑定M &lt;: ModelA[M] 以使方法fooN 工作。 ModelA2 仍然可以扩展 ModelA[ModelA1],但不能扩展 ModelA[ModelB1]。另一方面,ModelB 类没有进一步限制类型绑定,因此ModelB2 可以扩展ModelB[ModelA1]。方法 bar1bar2 限制类型绑定或参数 model,具体取决于在 model 上调用方法 transformbar 的顺序。

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 = ???
}

【讨论】:

  • 好的,感谢您指出这是一个类型绑定。现在我仍然不明白为什么边界在 Model[M] 上,它是一个自引用类型边界。
  • 我已经扩展了我的示例。
猜你喜欢
  • 2020-06-11
  • 2020-05-25
  • 2019-05-13
  • 1970-01-01
  • 2017-03-28
  • 2012-03-16
  • 2022-07-01
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多