Как написать scala matcher для класса? - PullRequest
3 голосов
/ 28 февраля 2012

Предположим, у меня есть следующий код

def get[T](name:String)(implicit mf:ClassManifest[T]):T = mf.erasure match {
     case classOf[Boolean] => obj.getBoolean(name)
     case classOf[Int] => obj.getInt(name)
   }

Теперь код не работает, потому что classOf [Int] является недопустимым значением соответствия.

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Вы почти наверняка должны исследовать альтернативы использованию манифестов и сопоставлений на объектах классов.В этом случае классы типов обеспечат гораздо более чистое решение,

// 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], тогда как они будут приравнены к тесту времени выполнения.

2 голосов
/ 29 февраля 2012

Это работает для меня:

val mf = //some manifest
mf.erasure match {
  case c if c == classOf[String] => "string!"
  case c if c == classOf[Int] => "int!"
  case c if c == classOf[Boolean] => "bool!"
  //...
}
...