如何在Scala Seq [T]或Option [T]中获取基本类型参​​数的实际类型?

时间:2012-11-25 23:14:35

标签: java scala reflection

例如,如果我有class NewClass(val a: Seq[String]),我可以通过classOf[NewClass].getDeclaredFields.head.getGenericType.asInstanceOf[java.lang.reflect.ParameterizedType].getActualTypeArguments.head.asInstanceOf[Class[_]]获取java.lang.String类型参数的实际类型。

但是,如果type参数是基本类型(在Java中不允许,但在Scala中允许),例如class NewClass(val a: Seq[Int]),则使用相同的方法只会产生java.lang.Object。有没有办法让我知道它实际上是Int而不是一般的java.lang.Object

2 个答案:

答案 0 :(得分:2)

你能使用清单吗?

scala> class NewClass[T](val a: Seq[T])(implicit m: Manifest[T])
defined class NewClass

scala> class NewClass[T](val a: Seq[T])(implicit m: Manifest[T]) {
     |   def typeOfA = m.erasure
     | }
defined class NewClass

scala> val newClass = new NewClass(Seq(1, 2, 3))
newClass: NewClass[Int] = NewClass@494e1df7

scala> newClass.typeOfA
res17: java.lang.Class[_] = int

答案 1 :(得分:0)

如果您定义类似下面的版本,它将适用于具有一个类型参数的所有类。

scala> def f[F[_],A](a: F[A])(implicit m:Manifest[A]) = m.erasure
f: [F[_], A](a: F[A])(implicit m: Manifest[A])java.lang.Class[_]

scala> f(Option(1))
res4: java.lang.Class[_] = int

scala> f(List(1,2,3))
res5: java.lang.Class[_] = int

scala> f(new NewClass(Seq(1, 2, 3)))
res6: java.lang.Class[_] = int

scala> f(new NewClass(Seq(1, 2, 3)).a)
res8: java.lang.Class[_] = int