名为“*”的方法导致编译错误

时间:2013-01-17 05:29:07

标签: scala operator-keyword operator-precedence

我对此代码感到困惑:

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 *不是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"
}

BTW,如果我们删除'隐藏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"
}

*的优先级高于隐式参数,但/优先级较低吗?或者还有其他原因*在这种情况下*不起作用?

1 个答案:

答案 0 :(得分:3)

我倾向于认为问题在于*String重叠到Predef(如"AA" * 5中),因此,当您添加时你自己的*,转换中的含糊不清使Scala丢弃了它们。

弃置了转化后,我们就会试图在*上找到String,但它不存在。

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