编译器无法识别自我类型注释

时间:2016-10-04 09:37:43

标签: scala compiler-errors self-type

我想要一个类强制它的子类来实现特征的子特性并尝试这个:

sealed trait TA
sealed trait TB extends TA
sealed trait TC extends TA

sealed trait CA {
  this: TA =>
}
final class CB extends CA with TB
final class CC extends CA with TC

def ca: CA = if (scala.util.Random.nextBoolean) new CB()
             else new CC()
def ta: TA = ca

使用下面的代码我得到以下编译器错误:

Error:(16, 16) type mismatch;
 found   : CA
 required: TA
  def ta: TA = ca
  1. 如果我有自我类型注释,CA可能不是TA:“this:TA =>”或者这是编译器中的一个小故障?
  2. 有更好的方法来实现这个吗?

2 个答案:

答案 0 :(得分:1)

自我类型是一种私人继承" (好吧,它不是真正的继承,但相似),你不能在课堂之外使用它。

如果您必须:{/ p>,您可以让CA实施转化

trait CA { this: TA => 
  def ta: TA = this
}

至于你关于实施这个"的更好方法的问题,很难说,因为它根本不清楚你在这里尝试做什么

为什么不将CA扩展为TA?就像我说的那样,自我类型非常类似于私人继承",你听起来像是想要继承,但不希望它是私有的。那么......为什么不使用继承?

答案 1 :(得分:0)

CA本身并不会延伸TA,自我注释意味着您在扩展时只能将CATA结合使用。它是编译器的暗示。事实上,如果你看一下字节码CA并没有扩展任何东西。

CBCC都将TA扩展为TBTC,这就是

的原因
def ca: TA = if (scala.util.Random.nextBoolean) new CB() else new CC() 

作品。