[英]Scala: deferring a trait method to an implicit class in parent trait's object
[英]Scala implicit conversion from parent trait
以下代碼無法編譯:
import scala.language.implicitConversions
trait Base {
class Wrp[+T](val v: T) // wrapper / internal representation
}
trait BooleanOps extends Base {
// implicit conversion
implicit def lift2BooleanOpsCls(x: Boolean): BooleanOpsCls =
new BooleanOpsCls(new Wrp[Boolean](x))
class BooleanOpsCls(wx: Wrp[Boolean]) {
def ||(wy: =>Wrp[Boolean]): Wrp[Boolean] = new Wrp[Boolean](wx.v || wy.v)
}
}
trait MyExample extends BooleanOps {
// test method
def foo(): Wrp[Boolean] = {
val ret: Wrp[Boolean] = false || new Wrp[Boolean](true)
ret
}
}
輸出:
MyExample.scala:18: error: type mismatch;
found : MyExample.this.Wrp[Boolean]
required: Boolean
val ret: Wrp[Boolean] = false || new Wrp[Boolean](true)
^
但如果我:
1)將class Wrp
放在Base之外
要么
2)將BooleanOps
的主體移動到MyExample
一切都編譯好了。
為什么原始示例不起作用? 如果您對此行為有一些了解,請幫助我們。 謝謝。
一個問題是def ||(wy: =>Wrp[Boolean])
參數的逐個調用性質def ||(wy: =>Wrp[Boolean])
如果你把它def ||(wy: Wrp[Boolean])
為def ||(wy: Wrp[Boolean])
它可以工作
但我同意,如果你在Wrp或BooleanOpsCls周圍移動它是有效的! 隱含解決方案的意圖或錯誤?
如果重命名||
,原始示例將起作用 方法。 編譯器找到false.||()
方法,並且不打算尋找可能在那里工作的隱式。
問題是沒有一個名為Wrp
類( Wrp
忽略T
) - Base
沒有定義Wrp
,而是定義了擴展Base
每個具體類的命名子類。 暗示也是紅鯡魚。 贈品的錯誤是提到MyExample.this.Wrp
- 請記住,即使MyExample
也沒有這樣的類 - val x = new MyExample
將具有Object with MyExample
類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.