假设
trait A { def t : Int }
trait B { this: A => }
为什么编译器不“知道”我可以t
调用B
?
def test(b: B): Int = b.t // doesn't work
但我(显然是多余的?)需要做
def test(b: B with A): Int = b.t
自我类型不是特质或类别契约的一部分。也就是说,它们不对特征或类提供外部可见的限制,只提供内部可见的限制。自类型在对象实例化时被检查,但除此之外只能由声明的特征或任何继承的特征/类/对象使用。在 Java 术语中,您可以将 self-type 视为类似于protected interface
trait 声明的 aa 的东西(尽管 Java 当然实际上并不支持这样的东西)。
如果你想让你的测试工作,你需要让 B 对 A 的依赖在外部可见。这是通过“扩展”声明完成的,也就是简单的子类化
trait A { def t : Int }
trait B extends A
def test( b: B ) : Int = b.t