Удалите модификатор implicit
для val ctg
, и вы увидите, что ваш код не компилируется.Вы не должны определять неявное ClassTag
/ TypeTag
/ WeakTypeTag
вручную, они должны генерироваться компилятором автоматически, когда тип известен.
На самом деле, когда вы вызываете implicitly[ClassTag[TT]]
неявное val ctg: ClassTag[TT]
выиспользуется определение прямо сейчас, поэтому оно null
во время выполнения.
Последствия разрешаются во время компиляции, и, когда вы вызываете sub1.ctg
, разрешение вызова .ctg
происходит во время выполнения (этокак работает полиморфизм подтипов).Во время компиляции еще не известно, что это Sub1#ctg
.
Замените
implicit val ctg: ClassTag[TT] = implicitly[ClassTag[TT]]
на
def ctg(implicit tag: ClassTag[TT]): ClassTag[TT] = implicitly[ClassTag[TT]]
, и у вас будет Int
во время выполнения вместо null
.