1

私はこのコードについて少し混乱しています:

abstract class Abstract3 {   
    type TP
    protected def action(arg: TP): TP   
    def *[T <% TP](arg: T) = action(arg) 
}

class Concrete3(str: String) extends Abstract3 {   
    type TP = Concrete3 
    override protected def action(arg: TP) = new TP("") 
}

class Test3 {   
    implicit def str2Concrete(s: String)(implicit num: Int) = new Concrete3(s)   
    implicit val a = 1
    val foo = "AA" * "BB" * "CC" 
}

Scala コンパイラはそれをコンパイルせず、次のエラー メッセージが表示されます。

test.scala:15: エラー: 値 * は String val のメンバーではありません foo = "AA" * "BB" * "CC" ^ 1 つのエラーが見つかりました

しかし、''*'' を '/' などに変更すると、正常にコンパイルされます。

abstract class Abstract3 {
  type TP
  protected def action(arg: TP): TP
  def /[T <% TP](arg: T) = action(arg)
}

class Concrete3(str: String) extends Abstract3 {
  type TP = Concrete3
  override protected def action(arg: TP) = new TP("")
}

class Test3 {
  implicit def str2Concrete(s: String)(implicit num: Int) = new Concrete3(s)
  implicit val a = 1 
  val foo = "AA" / "BB" / "CC"
}

ところで、'implicit num: Int' を削除すると、問題なくコンパイルされます。

abstract class Abstract3 {
  type TP
  protected def action(arg: TP): TP
  def *[T <% TP](arg: T) = action(arg)
}

class Concrete3(str: String) extends Abstract3 {
  type TP = Concrete3
  override protected def action(arg: TP) = new TP("")
}

class Test3 {
  implicit def str2Concrete(s: String) = new Concrete3(s)
  val foo = "AA" * "BB" * "CC"
}

* は暗黙のパラメーターよりも優先順位が高く、/ は優先順位が低いですか? または、この場合 * が機能しない他の理由がありますか?

4

1 に答える 1

3

問題はby (のように) に*オーバーロードされているという事実にあると私は信じがちです。そのため、独自のものを追加すると、変換が曖昧になり、Scala はそれらの両方を破棄します。StringPredef"AA" * 5*

*変換が破棄されると、 onを検索しようとして残りますがString、そこにはありません。

その考えの問題は"AA" * 2、インポートでも機能し、追加した変換が暗黙のパラメーターなしで機能することです。しかし、私はまだ答えはそのようにあると思います。

于 2013-01-17T05:52:36.750 に答える