为什么当涉及自我类型时,类型成员边界停止工作

时间:2018-02-06 21:33:37

标签: scala generics typing

假设我用自我类型定义了一些特征。 traits和self类型都有一个抽象类型的成员。自我类型中的抽象类型成员应该被特征中的自我类型覆盖。

trait Foo{
  type My
  def make:Seq[My]
}

trait Component {
  type My
}

trait Bar extends Foo { this:Component =>
  override type My <: StuffDoer

  def len = make.map(_.doStuff)

  class StuffDoer(str:String) {
    def doStuff = "blah"
  }
}

这不起作用并给出错误:

Error:(20, 24) value doStuff is not a member of Bar.this.My
    def len = make.map(_.doStuff)

似乎My内的Bar不一定是StuffDoer类型,但为什么? MyBar的确切界限是什么? Component是否会覆盖它的类型边界?

更奇怪的是,当我将override type My <: StuffDoer内的Bar更改为:

override type My = StuffDoer
然后突然间,一切都在编译。怎么来???

1 个答案:

答案 0 :(得分:0)

如果类StuffDoer具有方法doStuff,那么所有子类都可以,但不是所有子类都可以。例如,NothingNullStuffDoer的子类型,但您无法在类型x.doStuff或{{1}的变量x上调用Nothing }}