小编Mic*_*ier的帖子

Scala抽象类型成员 - 继承和类型边界

今天我在Scala遇到了一些奇怪的情况,当时我试图改进抽象类型成员的类型边界.

我有两个特性定义类型成员的边界,并将它们组合在一个具体的类中.这工作正常但是当匹配/转换特征组合时,两个TypeBounds中只有一个是"活跃的",我很难理解为什么......

我试着准备一个例子:

trait L
trait R

trait Left {
  type T <: L
  def get: T
}

trait Right {
  type T <: R
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我将这两个特征结合在一个具体的类中

val concrete = new Left with Right {
  override type T = L with R
  override def get: T = new L with R {}
}
Run Code Online (Sandbox Code Playgroud)

我可以按预期访问我的会员

// works fine
val x1: L with R = concrete.get
Run Code Online (Sandbox Code Playgroud)

但是如果我转向(左边右边)或模式匹配我再也无法访问该成员了.根据顺序,我从左或右获得类型边界,但不是两者的组合.

// can only access as R, L with R won't work
val x2: R = …
Run Code Online (Sandbox Code Playgroud)

scala abstract-type type-bounds type-members

4
推荐指数
1
解决办法
585
查看次数

标签 统计

abstract-type ×1

scala ×1

type-bounds ×1

type-members ×1