我想要一个类强制它的子类来实现特征的子特性并尝试这个:
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
答案 0 :(得分:1)
自我类型是一种私人继承" (好吧,它不是真正的继承,但相似),你不能在课堂之外使用它。
如果您必须:{/ p>,您可以让CA
实施转化
trait CA { this: TA =>
def ta: TA = this
}
至于你关于实施这个"的更好方法的问题,很难说,因为它根本不清楚你在这里尝试做什么
为什么不将CA
扩展为TA
?就像我说的那样,自我类型非常类似于私人继承",你听起来像是想要继承,但不希望它是私有的。那么......为什么不使用继承?
答案 1 :(得分:0)
CA
本身并不会延伸TA
,自我注释意味着您在扩展时只能将CA
与TA
结合使用。它是编译器的暗示。事实上,如果你看一下字节码CA
并没有扩展任何东西。
CB
和CC
都将TA
扩展为TB
和TC
,这就是
def ca: TA = if (scala.util.Random.nextBoolean) new CB() else new CC()
作品。