/ / Как да се получи действителният тип примитивен тип параметър в Scala Seq [T] или Option [T]? - java, скала, отражение

Как да получите действителния тип параметър на примитивен тип в Scala Seq [T] или Option [T]? - java, скала, отражение

Например, ако имам class NewClass(val a: Seq[String]), Аз съм в състояние да получи действителния тип на параметъра тип от classOf[NewClass].getDeclaredFields.head.getGenericType.asInstanceOf[java.lang.reflect.ParameterizedType].getActualTypeArguments.head.asInstanceOf[Class[_]] който е a java.lang.String.

Ако обаче типният параметър е примитивен тип (който не е разрешен в Java, но е разрешен в Scala), като например class NewClass(val a: Seq[Int]), като се използва един и същ подход, би довело само до постигане java.lang.Object, Има ли начин да знам, че всъщност е Int вместо общото java.lang.Object?

Отговори:

2 за отговор № 1

Можете ли да използвате манифеста?

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

0 за отговор № 2

Ако дефинирате версия по-долу, тя ще работи за всички класове, които имат един тип параметър.

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