我班上有一个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。我该怎么做才能消除这种错误?
答案 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)
最后一行也必须合法,因为bar
是Tagged[Foo]
的实例。但是,如果这是可能的,那么foo
错误TypeTag
(Bar
中的一个)最终会导致错误{{1}}。