1

假设

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
4

1 回答 1

4

自我类型不是特质或类别契约的一部分。也就是说,它们不对特征或类提供外部可见的限制,只提供内部可见的限制。自类型在对象实例化时被检查,但除此之外只能由声明的特征或任何继承的特征/类/对象使用。在 Java 术语中,您可以将 self-type 视为类似于protected interfacetrait 声明的 aa 的东西(尽管 Java 当然实际上并不支持这样的东西)。

如果你想让你的测试工作,你需要让 B 对 A 的依赖在外部可见。这是通过“扩展”声明完成的,也就是简单的子类化

trait A { def t : Int }
trait B extends A
def test( b: B ) : Int = b.t
于 2011-03-22T00:21:54.153 回答