2

下面代码中的类型细化似乎表明路径相关类型vt.ValueT包括this.type

trait ValueType {
  type ValueT <: Value

  type ConstrainedT <: ConstrainedValue

  def makeConstrainedValue(v: ValueT): ConstrainedT = ???
}

trait Value {
  type ValueTypeT <: ValueType { type ValueT >: this.type } // <--- HEY, COMPILER, READ THIS

  val vt: ValueTypeT

  def asConstrainedValue = vt.makeConstrainedValue(this) // <--- Compiler complains here
}

trait ConstrainedValue { /* details omitted */ }

但 Scala 编译器(版本 2.11.2)说:

error: type mismatch;
found   : Value.this.type (with underlying type Test.Value)
required: Value.this.vt.ValueT
   override def asConstrainedValue = vt.makeConstrainedValue(this)
                                                             ^

有什么理由在这里推断this.type <: vt.ValueT是非法的吗?还有另一种方法可以告诉编译器它需要知道什么吗?

我已经尝试将类型改进放在vt. 结果类型为volatile的编译器对象。也许这就是问题的线索。

细化{ type ValueT = this.type }生成相同的错误消息。

4

1 回答 1

5

我认为问题在于,在 bound中,编译器以某种方式混淆>: this.type了 for 的绑定。this如果我进行以下更改(并从中删除overrideasConstrainedValue,编译对我来说成功:

trait Value { self =>
  type ValueTypeT <: ValueType { type ValueT >: self.type }
  …
于 2015-08-13T02:05:33.827 回答