簡體   English   中英

從特質之外看不見的自我特質?

[英]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但是相反,無論何時混入BA必須在某一點混合。 由於您B with A refOfTypeB向下轉換為B而不是B with A您無法訪問任何類型A的方法。 B trait的實現中,您可以訪問A的方法,因為編譯器知道您在某些時候可以在任何已實現的類中訪問A 考慮它可能更容易,因為B取決於A而不是BA

有關更全面的解釋,請參閱以下答案: 自我類型和特質子類之間有什么區別?

問題是當你聲明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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM