Scala中隐式参数与TypeTag的适用场景及选型原因解析
处理Scala中的类型擦除问题:隐式参数 vs TypeTag
在Scala里,类型擦除确实是个让人头疼的问题,不过咱们有不少办法能搞定它——除了官方推出的TypeTag来保留编译期类型信息到运行时,有时候用隐式参数(甚至普通值参数)也能应对同样的场景,给你举两个具体的例子看看:
1. 用隐式参数实现类型判断
这种方式通过传入隐式的T类型实例,让模式匹配在运行时能获取到具体的类型信息,从而绕开类型擦除的限制:
// 隐式参数实现 def getKindName[T](implicit x: T): String = { x match { case _: People => "Mammals" case _: Sparrow => "Birds" case _: Shark => "Fishes" case _: Crocodile => "Reptiles" case _ => ??? } }
2. 用TypeTag实现类型判断
TypeTag是Scala专门为解决类型擦除问题设计的工具,它能把编译期的类型信息携带到运行时。通过上下文界定[T: TypeTag]可以自动获取对应类型的TypeTag,然后借助typeOf[T]来做精确的类型匹配:
// TypeTag实现 import scala.reflect.runtime.universe._ def getKindName[T: TypeTag]: String = { typeOf[T] match { case t if t =:= typeOf[People] => "Mammals" case t if t =:= typeOf[Sparrow] => "Birds" case t if t =:= typeOf[Shark] => "Fishes" case t if t =:= typeOf[Crocodile] => "Reptiles" case _ => ??? } }
内容的提问来源于stack exchange,提问作者Leyla Lee
相关产品推荐
相关产品推荐

