【问题标题】:Scala TypeTag missing class nameScala TypeTag 缺少类名
【发布时间】:2015-11-04 20:07:21
【问题描述】:

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

【问题讨论】:

    标签: scala generics reflection


    【解决方案1】:

    问题是daos 的类型是Seq[AbstractDao[_]]。所以在调用daos.map(genericImportEntities(_)) 时,T 是编译器调用_1 的未知类型。通常,TypeTags 仅在您知道编译器应该插入静态类型时才有用,而在这种情况下您不知道。

    解决此问题的最简单方法是将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中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多