Преобразование и стирание типов - PullRequest
2 голосов
/ 10 ноября 2011

Есть ли лучший способ написать этот блок кода? В частности, возможно ли учесть преобразование во внешнюю функцию?

nodes collect { case x: InstrumentSource[_] if (x.m <:< implicitly[ClassManifest[BarClose]]) => x.asInstanceOf[InstrumentSource[BarClose]] };

m в InstrumentSource является манифестом класса:

case class InstrumentSource[A](implicit val m: ClassManifest[A])

и узлы - это коллекция различных InstrumentSource.

1 Ответ

1 голос
/ 10 ноября 2011

Моя идея такова:

trait HasClassManifest[A] {
  def m: ClassManifest[A]    
}

object <-< {
  def apply[A : ClassManifest](a: HasClassManifest[_]): Boolean = {
    a.m <:< classManifest[A]
  }
}

case class InstSource[A](implicit m: ClassManifest[A]) extends HasClassManifest[A]

Seq(InstSource[Long],InstSource[Double]) collect {
  case x if <-<[Long](x)   => println("long")
  case x if <-<[Double](x) => println("double")
}

(переименован InstrumentSource в InstSource, чтобы не прокручивать здесь)
Таким образом, цена определяет HasClassManifest и <-< один раз и каждый класс, для которого вы хотите сопоставить паттерндолжен продлить HasClassManifest.Вот и все.
Но я не знаю, как вычленить преобразование instanceOf на правой стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...