[英]Scala TypeTag missing class name
我正在尝试使用Scala的反射库获取一些信息:
abstract class Model
class Person extends Model
class Car extends Model
abstract class AbstractDao[T <: Model]
object PersonDao extends AbstractDao[Person]
object CarDao extends AbstractDao[Car]
object DataLoader {
val daos = Seq(PersonDao, CarDao)
val modelToString = daos.map(genericImportEntities(_))
val modelToString2 = Seq(genericImportEntities(PersonDao), genericImportEntities(CarDao))
private def genericImportEntities[T <: Model](dao: AbstractDao[T])
(implicit
t2: TypeTag[T]
): String = {
t2.tpe.toString
}
}
如果我调用modelToString,则输出为List(_1,_1)
与modelToString2一起,它是List(Person,Car)
任何想法如何使modelToString工作?
问题是daos
类型是Seq[AbstractDao[_]]
。 因此,当调用daos.map(genericImportEntities(_))
, T
是编译器调用_1
的未知类型。 通常, TypeTag
仅在知道静态类型时才有用,编译器应在其中插入静态类型,而在这种情况下则不需要。
解决此问题的最简单方法是将TypeTag
移到AbstractDao
:
abstract class AbstractDao[T <: Model](implicit val tag: TypeTag[T])
private def genericImportEntities[T <: Model](dao: AbstractDao[T]) =
dao.tag.tpe.toString
然后,编译器在PersonDao
和CarDao
定义处插入标签,以后可以在genericImportEntities
使用它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.