将隐式变量从私有变为公共原因协变类型T出现在不变位置'错误

时间:2016-06-06 15:01:39

标签: scala type-erasure scala-implicits

我班上有一个TypeTag:

abstract class Tagged[+T](implicit ttg: TypeTag[T])

TypeTag(在这种情况下是一个私有变量)引起了一些问题,因为它不可序列化。所以尝试将其声明为@transient:

abstract class Tagged[+T](@transient implicit val ttg: TypeTag[T])

但是这个看似微不足道的变化引起了一个大问题,Scala编译器抛出了以下错误:

Error:(16, 51) covariant type T occurs in invariant position in type => org.apache.spark.sql.catalyst.ScalaReflection.universe.TypeTag[T] of value ttg
abstract class Tagged[+T](@transient implicit val ttg: TypeTag[T] = null) extends Extractor[T] with Static {
                                                  ^

我所做的只是将私有变量更改为public。我该怎么做才能消除这种错误?

1 个答案:

答案 0 :(得分:0)

您没有“只是将私人变量更改为公开”。您将构造函数参数更改为成员变量。要看,为什么这是一个问题,请考虑一下:

  class Foo
  class Bar extends Foo


  val bar: Tagged[Foo]  = new Tagged[Bar](){}
  // The above is legal because T is covariant
  val foo = Tagged[Foo](bar.ttg)

最后一行也必须合法,因为barTagged[Foo]的实例。但是,如果这是可能的,那么foo错误TypeTagBar中的一个)最终会导致错误{{1}}。