Изменение неявной переменной с частной на публичную причину "ковариантный тип 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
).