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: error: value * is not a member of String val foo = "AA" * "BB" * "CC" ^ 发现一个错误

但是如果我们将 ''*'' 更改为 '/' 或其他任何内容,它将成功编译:

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*

丢弃转换后,它会尝试在 上查找*String但它不存在。

这个想法的问题是"AA" * 2即使使用导入仍然有效,并且您添加的转换在没有隐式参数的情况下有效。但我仍然认为答案是这样的。

于 2013-01-17T05:52:36.750 回答