[英]Self in trait invisible from outside the trait?
trait A { def someMethod = 1}
trait B { self : A => }
val refOfTypeB : B = new B with A
refOfTypeB.someMethod
最后一行導致類型不匹配錯誤。 我的問題是:當給出B也是A型時,為什么不可能達到(A)的方法?
所以B
也不是A
型。 你在這里使用的自我類型注釋特別指出B
不擴展A
但是相反,無論何時混入B
, A
必須在某一點混合。 由於您B with A
refOfTypeB
向下轉換為B
而不是B with A
您無法訪問任何類型A
的方法。 在B
trait的實現中,您可以訪問A
的方法,因為編譯器知道您在某些時候可以在任何已實現的類中訪問A
考慮它可能更容易,因為B
取決於A
而不是B
是A
有關更全面的解釋,請參閱以下答案: 自我類型和特質子類之間有什么區別?
問題是當你聲明refOfTypeB時,你指定了類型B但沒有指定類型B和A.
self =>語法允許您訪問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究竟是什么方面更具表現力。
這就是蛋糕模式的樣板。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.