scala - 编译器似乎忽略类型细化中的类型绑定(bind)

标签 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 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/

相关文章:

Scala 类型投影 : pick an object within a path-dependent trait

multithreading - 这段代码中是否存在潜在的饥饿问题,或者只是我?

java - 泛型类型推断失败?

haskell - 当类型变量应该不明确时,为什么会推断出 Integer?

Scala 类型参数推断失败

scala - Scala 可以注意到路径相关类型之间的身份吗?

scala - 如何使用嵌套元组或 HList 使用 Slick 处理 > 22 列的表?

scala - 如何使用 Play Framework (scala)在HTML中打印@符号

scala - 是一种更惯用的(并且希望是优雅的)方式来组合可变元素(长度)的 Scala 不可变映射吗?

scala - Scala 中具有隐式封闭实例的路径依赖工厂