Scala中有没有更优的方式检测不带类型实参的泛型类型?
你当前的实现已经是Scala运行时反射场景下,忽略类型实参筛选泛型成员的标准可运行方案,以下是两种常用的优化方式,可简化代码、提升复用性:
方案1:封装通用匹配工具
将类型构造器匹配逻辑封装为通用方法,避免每次重复编写获取类型构造器的代码:
import scala.reflect.runtime.universe._ import scala.reflect.runtime.currentMirror // 通用工具方法:判断目标类型的构造器是否与泛型参数T的构造器一致 def typeConstructorMatches[T: TypeTag](targetType: Type): Boolean = { targetType.typeConstructor == typeOf[T].typeConstructor } // 实际调用逻辑更简洁 val myListMembers = currentMirror.reflect(MyObject) .symbol .asClass .typeSignature .members .filter(member => typeConstructorMatches[List[_]](member.typeSignature.resultType))
方案2:兼容子类继承的灵活实现
如果需要匹配List的所有子类(比如Scala中List的具体实现类::),可以将相等判断替换为子类型判断<:<,适配继承场景:
def typeConstructorMatches[T: TypeTag](targetType: Type): Boolean = { targetType.typeConstructor <:< typeOf[T].typeConstructor }
补充说明
你觉得繁琐的typeOf[List[_]].typeConstructor写法本身是编译期安全的实现,比字符串匹配类名的方案更可靠,不会出现拼写错误、同名类误匹配的问题。如果仅需单次匹配不需要复用,也可以直接把判断逻辑内联到filter中:
val myListMembers = currentMirror.reflect(MyObject) .symbol .asClass .typeSignature .members .filter(_.typeSignature.resultType.typeConstructor == typeOf[List[_]].typeConstructor)
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

