为什么在约束特征上调用方法时不会查找自我类型?

时间:2011-03-22 00:13:22

标签: scala self-type

假设

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

1 个答案:

答案 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