Scala TypeTag不会阻止类型擦除

时间:2016-04-01 19:03:17

标签: scala type-erasure

在这个帖子中,我为TraversableLike写了一个简单的辅助函数:

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 个答案:

答案 0 :(得分:1)

ClassTag支持此功能,因为您可以从Class获得Class,而 > TypeTag获取scala.reflect.runtime.universe.TypeTag a implicit val classTagB = ClassTag[B](mirror.runtimeClass(typeTag[B].tpe)) :例如在宏中,该类尚未编译。但大概你使用from rest_auth.serializers import PasswordResetSerializer from allauth.account.forms import ResetPasswordForm class PasswordSerializer (PasswordResetSerializer): password_reset_form_class = ResetPasswordForm ,在这种情况下你可以写

REST_AUTH_SERIALIZERS = {
    'PASSWORD_RESET_SERIALIZER': 'api.helpers.pwdreset.PasswordSerializer',
}