在这个帖子中,我为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是否有原因失败?
答案 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',
}