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

Self type annotation not recognized by compiler

我想要一个 class 来强制它的子classes 实现一个特征的子特征并试过这个:

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. 有没有更好的方法来实现这个?

自身类型是"private inheritance"的一种(好吧,不是真正的继承,而是类似),不能在class之外使用。

如果必须,您可以让 CA 实施转换:

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

至于你关于 "better way to implement this" 的问题,很难说,因为根本不清楚你想在这里做什么。

例如,

为什么不让 CA 扩展 TA?就像我说的,self-type 与 "private inheritance" 非常相似,你听起来像是想要继承,但又不想让它成为私有的。那么...为什么不直接使用继承呢?

CA 本身不会扩展 TA,自注释意味着扩展时只能将 CATA 结合使用。这是对编译器的提示。事实上,如果您查看字节码,CA 不会扩展任何内容。

CBCC 都通过 TBTC 扩展了 TA,这就是为什么

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

有效。