2015-11-03 53 views
0

我试图让使用Scala的反映图书馆的一些信息:斯卡拉TypeTag缺少类名

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

问题是那种daosSeq[AbstractDao[_]]。所以当调用daos.map(genericImportEntities(_))时,T是编译器调用的未知类型_1。通常,TypeTag仅适用于在编译器插入它们的位置知道静态类型的情况,在这种情况下您不知道。

来解决,这将是移动TypeTagAbstractDao最简单的方法:

abstract class AbstractDao[T <: Model](implicit val tag: TypeTag[T]) 

private def genericImportEntities[T <: Model](dao: AbstractDao[T]) = 
    dao.tag.tpe.toString 

然后编译器插入标签在PersonDaoCarDao定义,他们可以在后面genericImportEntities使用。

+0

很好的答案,谢谢! – KaC