编译器无法识别自身类型注释
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
- 当我有自我类型注释时,CA 不能是 TA:"this: TA =>" 或者这是编译器中的一个小故障?
- 有没有更好的方法来实现这个?
自身类型是"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
,自注释意味着扩展时只能将 CA
与 TA
结合使用。这是对编译器的提示。事实上,如果您查看字节码,CA
不会扩展任何内容。
CB
和 CC
都通过 TB
和 TC
扩展了 TA
,这就是为什么
def ca: TA = if (scala.util.Random.nextBoolean) new CB() else new CC()
有效。
我想要一个 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
- 当我有自我类型注释时,CA 不能是 TA:"this: TA =>" 或者这是编译器中的一个小故障?
- 有没有更好的方法来实现这个?
自身类型是"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
,自注释意味着扩展时只能将 CA
与 TA
结合使用。这是对编译器的提示。事实上,如果您查看字节码,CA
不会扩展任何内容。
CB
和 CC
都通过 TB
和 TC
扩展了 TA
,这就是为什么
def ca: TA = if (scala.util.Random.nextBoolean) new CB() else new CC()
有效。