簡體   English   中英

Scala從父特征隱式轉換

[英]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.

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