Изменение неявной переменной с частной на публичную причину "ковариантный тип T происходит в инвариантной позиции" Ошибка

У одного из моих классов есть 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 {
                                                  ^

Я просто изменил приватную переменную на публичную. Что я должен сделать, чтобы устранить такую ​​ошибку?

1 ответ

Вы не "просто изменили приватную переменную на публичную". Вы изменили параметр конструктора на переменную-член. Чтобы понять, почему это проблема, подумайте над этим:

  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).

Другие вопросы по тегам