Вы сталкиваетесь с SI-9553 , ошибкой компилятора, которому три с половиной года.
Причина, по которой ошибка не была исправлена, вероятно,отчасти потому, что существует чрезвычайно простой обходной путь - просто поместите явный параметр типа в расширяемый класс, который вы расширяете:
trait A
object A {
implicit class SeqA[T](v: Seq[T])(implicit x: T => A) extends A
implicit class IntA(v: Int) extends A
implicit class TupleA(v: (Int, Int)) extends SeqA[Int](Seq(v._1, v._2))
}
Это, вероятно, хорошая идея в любом случае, так как вы в любой момент напрашиваетесь на неприятностивы позволяете выводить параметры типа там, где задействованы неявные определения.
В качестве примечания вы можете исследовать подобные проблемы с помощью опции компилятора, например -Xprint:typer
.В этом случае он показывает следующее в REPL:
// ...
implicit class TupleA extends $line6.$read.$iw.$iw.A.SeqA[Int] {
<paramaccessor> private[this] val v: (Int, Int) = _;
def <init>(v: (Int, Int)): $line6.$read.$iw.$iw.A.TupleA = {
TupleA.super.<init>(scala.collection.Seq.apply[Int](v._1, v._2))({
((v: Int) => A.this.IntA(v))
});
()
}
};
implicit <synthetic> def <TupleA: error>(v: (Int, Int)): <error> = new TupleA(v)
, что в этом случае не очень полезно, но, по крайней мере, указывает, что проблема возникает в определении метода синтетического преобразования дляTupleA
неявный класс, а не в какой-то момент до этого.