2016-04-01 4 views
1

В этой теме, я пишу простую вспомогательную функцию для TraversableLike:Scala TypeTag не препятствует Тип Erasure

How to specify a type parameter in calling a function while let the compiler infer the other?

Я реализовать следующую функцию:

implicit class TraversableLikeView[A, Repr](self: TraversableLike[A, Repr]) { 

    def filterByType[B: TypeTag] = new FilterByType[B] 

    class FilterByType[B: TypeTag] { 

     def get[That](implicit bf: CanBuildFrom[Repr, B, That]): That = { 
     val result = self.flatMap{ 
      v => 
      val unboxed = Utils.javaUnbox(v) 
      unboxed match { 
       case x: B => Some(x) 
       case _ => None 
      } 
     }(bf) 
     result 
     } 
    } 
    } 

TypeTag используется, поскольку ClassTag.unapply имеет некоторую проблему при обработке примитивных классов. Однако, когда я скомпилировать код выше, я получил следующее предупреждение:

Warning:(304, 23) abstract type pattern B is unchecked since it is eliminated by erasure 
       case x: B => Some(x) 
        ^

противоестественным, что TypeTag утверждают, что делать (ClassTag делает почти идеальную работу здесь). Есть ли причина, по которой TypeTag терпит неудачу в этом случае?

ответ

1

Это поддерживается только ClassTag, потому что вы можете получить Class от него, и вы не можете вообще получить Class от TypeTag: например, в макросах класс еще не скомпилирован. Но, вероятно вы используете scala.reflect.runtime.universe.TypeTag, в этом случае вы можете написать

implicit val classTagB = ClassTag[B](mirror.runtimeClass(typeTag[B].tpe)) 
+0

Я думал ClassTag уже устаревшим в последней версии Scala и TypeTag является преемником? Итак, что такое TypeTag? – tribbloid

+0

Нет, 'ClassTag' не устарел. 'ClassManifest' и' ClassTag' является его заменой. –

Смежные вопросы