В этой теме, я пишу простую вспомогательную функцию для 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 терпит неудачу в этом случае?
Я думал ClassTag уже устаревшим в последней версии Scala и TypeTag является преемником? Итак, что такое TypeTag? – tribbloid
Нет, 'ClassTag' не устарел. 'ClassManifest' и' ClassTag' является его заменой. –