Есть ли способ извлечь тип элемента из манифеста [List [X]] в Scala? - PullRequest
4 голосов
/ 12 марта 2012

Я знаю, что что-то представляет собой Список [_], основанный на Манифесте, который я передал методу, но мне нужно знать, что это за элемент списка. Эта информация где-то хранится в Манифесте, и можете ли вы ее получить? Если нет, какие-либо предложения о том, как обойти эту проблему?

(По сути, у меня есть карта [Manifest [_], Blah], где Blah обрабатывает случаи на основе типа класса. Обработка списка [X] составляется на основе X, но мне нужно уметь выяснить, что X, так что я могу взять его значение Бла из карты.)

Спасибо!

Ответы [ 3 ]

6 голосов
/ 12 марта 2012

Я думаю, что вы ищете typeArguments

scala> manifest[List[Int]]
res1: Manifest[List[Int]] = scala.collection.immutable.List[Int]

scala> res1.typeArguments
res2: List[scala.reflect.Manifest[_]] = List(Int)

scala> res2.head
res3: scala.reflect.Manifest[_] = Int

scala> res3.erasure
res4: java.lang.Class[_] = int
5 голосов
/ 12 марта 2012

Трудно сказать вам, что делать, без кусочка примера кода. Итак, из того, что вы написали, я предполагаю, что вы получите A [B] в качестве параметра. Это должно работать так:

def foo[A[B], B](x: A[B])(implicit outer: ClassManifest[A[B]], inner: ClassManifest[B]) = {
  // your code here
}
1 голос
/ 12 марта 2012

Итак, у вас есть Manifest[List[T]] и вы хотите обработать на основе T?Как насчет

def listType[T](m: Manifest[T]) = 
  if (m.erasure == classOf[List[_]]) m.typeArguments match {
    case List(c) if c.erasure == classOf[Int] => "it's a List[Int]"
    case List(c) if c.erasure == classOf[String] => "it's a List[String]"
    case _ => "some other List"
  } else "not a List"


scala> listType(implicitly[Manifest[List[Int]]])
res29: java.lang.String = it's a List[Int]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...