2015-11-03 51 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