我正在尝试使用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,则输出为 列表(_1,_1)
使用modelToString2,它是 清单(人,车)
任何想法如何让modelToString工作?
答案 0 :(得分:1)
问题是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
中使用它们。