假设
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
答案 0 :(得分:4)
自我类型不属于特质或阶级合同的一部分。也就是说,它们不对特征或类提供外部可见限制,只提供内部可见限制。在对象实例化时检查自我类型,但是只能由声明特征或任何继承特征/类/对象使用。在Java术语中,您可以将自我类型视为类似于特征声明的protected interface
(尽管Java当然不支持这样的事情)。
如果您希望测试起作用,则需要使B对A的依赖性在外部可见。这是通过“扩展”声明完成的,a.k.a。简单的子类化
trait A { def t : Int }
trait B extends A
def test( b: B ) : Int = b.t