下面代码中的类型细化似乎是说路径依赖类型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 }
生成相同的错误消息。
最佳答案
我认为问题在于,在绑定(bind)的 >: this.type
中,this
的绑定(bind)被编译器以某种方式搞乱了。如果我进行以下更改(并从 asConstrainedValue
中删除 override
),编译会成功:
trait Value { self =>
type ValueTypeT <: ValueType { type ValueT >: self.type }
…
关于scala - 编译器似乎忽略类型细化中的类型绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31978200/