1

我的一个班级有一个 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 {
                                                  ^

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

4

1 回答 1

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遇到错误TypeTag(来自 的一个Bar)。

于 2016-06-06T22:29:46.437 回答