[英]Scala TypeTag missing class name
我正在嘗試使用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,則輸出為List(_1,_1)
與modelToString2一起,它是List(Person,Car)
任何想法如何使modelToString工作?
問題是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
使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.