trait A { def someMethod = 1}
trait B { self : A => }
val refOfTypeB : B = new B with A
refOfTypeB.someMethod
最后一行导致类型不匹配错误。我的问题是:当给出B也是A型时,为什么不可能达到(A)的方法?
答案 0 :(得分:2)
因此B
也不属于A
类型。您在此处使用的自我类型注释明确指出B
不会延伸A
,而是在B
混入的任何地方,A
必须混合在一起某些方面也是如此。由于您将refOfTypeB
转发为B
而不是B with A
,因此您无法访问任何类型A
的方法。在B
特征的实现内部,您可以访问A
的方法,因为编译器知道您在任何实现的类中都可以访问A
。考虑它可能更容易,因为B
取决于A
而不是B
是A
。
有关更详尽的说明,请参阅此答案:What is the difference between self-types and trait subclasses?
答案 1 :(得分:0)
问题是当您声明refOfTypeB时,您指定了类型B但没有使用A键入B.
自我=>语法允许您访问B中的A属性并传递编译。
但是,在运行时,refOfTypeB不能识别为带有A的B,并且编译器不一定正确地具有功能映射。
所以,正确的语法应该是:
trait A { def someMethod = 1}
trait B { self : A => }
val refOfTypeB : B with A = new B with A
refOfTypeB.someMethod //1
实际上,这在解释refOfTypeB究竟是什么方面更具表现力。
这就是蛋糕模式的样板。