私はこのコードについて少し混乱しています:
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"
}
* は暗黙のパラメーターよりも優先順位が高く、/ は優先順位が低いですか? または、この場合 * が機能しない他の理由がありますか?