Вы почти наверняка должны исследовать альтернативы использованию манифестов и сопоставлений на объектах классов.В этом случае классы типов обеспечат гораздо более чистое решение,
// Assuming that Store is the type of obj ...
trait Get[T] { def get(s : Store, name : String) : T }
implicit val getBoolean = new Get[Boolean] {
def get(s : Store, name : String) : Boolean = s.getBoolean(name)
}
implicit val getInt = new Get[Int] {
def get(s : Store, name : String) : Int = s.getInt(name)
}
def get[T](name : String)(implicit inst : Get[T]) : T = inst.get(obj, name)
. В этой реализации вместо получения ошибки соответствия во время выполнения, если вы запросите неподдерживаемый тип, вместо этого вы получите статическую ошибку времени компиляции..
Также обратите внимание, что, будучи механизмом разрешения времени компиляции, примененным до стирания, этот метод намного более точен, чем сопоставление во время выполнения после стирания.Например, используя эту технику, мы можем различить случаи List[Int]
и List[String]
, тогда как они будут приравнены к тесту времени выполнения.