我对此代码感到困惑:
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"
}
*的优先级高于隐式参数,但/优先级较低吗?或者还有其他原因*在这种情况下*不起作用?
答案 0 :(得分:3)
我倾向于认为问题在于*
被String
重叠到Predef
(如"AA" * 5
中),因此,当您添加时你自己的*
,转换中的含糊不清使Scala丢弃了它们。
弃置了转化后,我们就会试图在*
上找到String
,但它不存在。
这个想法的问题是,即使使用导入,"AA" * 2
仍然有效,并且您添加的转换在没有隐含参数的情况下工作。但我仍然认为答案就是这样。