Scala 编译器似乎忽略了类型细化中的类型绑定

Scala 编译器似乎忽略了类型细化中的类型绑定,scala,type-inference,path-dependent-type,type-bounds,Scala,Type Inference,Path Dependent Type,Type Bounds,下面代码中的类型细化似乎表明路径相关类型vt.ValueT包括this.type: trait ValueType { type ValueT <: Value type ConstrainedT <: ConstrainedValue def makeConstrainedValue(v: ValueT): ConstrainedT = ??? } trait Value { type ValueTypeT <: ValueType { type Val

下面代码中的类型细化似乎表明路径相关类型
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 */ }

我想问题是在绑定的
:this.type
中,
this
的绑定被编译器搞糊涂了。如果我进行以下更改(&remove
override
from
asConstrainedValue
),编译将成功:

trait Value { self =>
  type ValueTypeT <: ValueType { type ValueT >: self.type }
  …
trait值{self=>
类型值typet:self.type}
…

谢谢!它起作用了!你认为这里需要
self=>
可能有什么原因吗?我真的不知道,对不起。啊,我想我刚刚弄明白了:
类型细化中的这个
指的是
ValueTypeT
对象,而不是
Value
对象。
trait Value { self =>
  type ValueTypeT <: ValueType { type ValueT >: self.type }
  …