В моем проекте у меня есть тип A
, используемый для аргументов в нескольких местах, где я хочу, чтобы несколько типов автоматически преобразовывались в этот тип. Я реализовал это, используя несколько неявных классов в сопутствующем объекте A
. Я удалил все, что не могло вызвать проблемы:
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(Seq(v._1, v._2))
}
Но scalac
отклоняет этот код из-за недопустимой циклической ссылки:
$ scalac -version
Scala compiler version 2.12.8 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
$ scalac A.scala
A.scala:5: error: illegal cyclic reference involving class TupleA
implicit class TupleA(v: (Int, Int)) extends SeqA(Seq(v._1, v._2))
^
one error found
В чем именно проблема? Что компилятор привязывает к выполнению / выводу / разрешению, содержащему недопустимый цилиндр?
Бонусные баллы за действительный способ реализации этих неявных классов.