在我的项目中,我有一个类型 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
这里到底有什么问题?编译器要做什么/推断/解析涉及非法循环?
实现这些隐式类的有效方法的加分。
1条答案
按热度按时间iqjalb3h1#
你遇到了si-9553,一个三年半的编译器错误。
这个bug没有被修复的部分原因可能是因为有一个非常简单的解决方法,就是在要扩展的泛型类上放置一个显式类型参数:
不管怎样,这可能是个好主意,因为在涉及隐式定义的地方,任何时候只要让类型参数被推断出来,都会自找麻烦。
作为补充说明,您可以使用编译器选项(如
-Xprint:typer
. 在本例中,它在repl中显示以下内容:在本例中,这并不是很有帮助,但它至少表明问题发生在
TupleA
隐式类,而不是在此之前的某个时刻。