2016-06-06 5 views
1

하나는 TypeTag 있습니다'공변 타입 T는 불변의 위치에서 발생하는'오류 내 클래스의

(이 경우 개인 변수)를 TypeTag 몇 가지 문제가 발생했습니다
abstract class Tagged[+T](implicit ttg: TypeTag[T]) 

직렬화 가능하지 않기 때문입니다. 그래서 @Transient로 선언하려고 : 내가 무슨 짓을

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 { 
               ^

단지 전용 변수로 변경된다

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

그러나이 보이는 사소한 변화가 큰 문제가 발생했습니다 스칼라 컴파일러는 다음과 같은 오류가 발생합니다 공공의. 그런 오류를 제거하기 위해 무엇을해야합니까?

답변

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]의 인스턴스이기 때문이다. 그러나 이것이 가능하다면, 이 잘못되어 TypeTag (하나는 Bar)이됩니다.