Проще говоря: Class
не несет никакой информации о параметрах типа.
Так, например,
classOf[Option[Int]] eq classOf[Option[String]]
вернет true
.Обратите внимание, что оператор eq
проверяет равенство ссылок, поэтому эти два объекта на самом деле являются одним и тем же объектом!
Попробуйте!
Даже с отражением, которое вы выиграли 'я не могу получить информацию, которой просто нет.
Я бы порекомендовал отказаться от использования значений Class
и вместо этого использовать параметры типа и классы типов для специального полиморфизма.Точное решение зависит от того, что вы действительно пытаетесь сделать.
Но вот пример того, как работают классы типов:
def get[F[_], A](a: F[A])(implicit ex: Extractor[A]): Unit = ex.extract
trait Extractor[A] {
def extract: Unit
}
implicit val intExtractor = new Extractor[Int] {
def extract: Unit = println("I am doing something for Int!")
}
implicit val strExtractor = new Extractor[String] {
def extract: Unit = println("I am doing something for String!")
}
val a = Some(1)
get(a)
Вывод:
I am doing something for Int!
Попробуйте!
Для получения дополнительной информации я бы порекомендовал прочитать Руководство астронавта Type Shapeless , которое (помимо обучения вас о Shapeless) поможет вам понять большеОбщие аспекты общего программирования в Scala.
Надеюсь, это поможет.