Scala TypeTag缺少类名

时间:2015-11-03 17:40:24

标签: scala generics reflection

我正在尝试使用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工作?

1 个答案:

答案 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

然后编译器根据PersonDaoCarDao的定义插入标记,稍后可以在genericImportEntities中使用它们。