Scala:类型别名与上限的类型匹配

时间:2016-05-04 05:51:58

标签: scala typing type-alias upperbound

我的问题很简单。

为什么此代码会出错,

abstract class A {
  type T <: A.Inner
  def toT: T = new A.Inner(this)
}

object A {
  class Inner(a: A)
}

// Exiting paste mode, now interpreting.

<console>:16: error: type mismatch;
 found   : A.Inner
 required: A.this.T
         def toT: T = new A.Inner(this)
                      ^

而这段代码没有?

abstract class A {
  type T = A.Inner
  def toT: T = new A.Inner(this)
}

object A {
  class Inner(a: A)
}

// Exiting paste mode, now interpreting.

defined class A
defined object A

A.Inner <: A.Inner。不是吗?

1 个答案:

答案 0 :(得分:2)

此处,应使用下限:

abstract class A {
  type T >: A.Inner
  def toT: T = new A.Inner(this)
}

object A {
  class Inner(a: A)
}

仅当TA.Inner的祖先时,A.Inner才能转换为T。我们使用下限来限制TA.Inner的祖先。