0

たとえば、 がある場合、であるclass NewClass(val a: Seq[String])型パラメーターの実際の型を取得できます。classOf[NewClass].getDeclaredFields.head.getGenericType.asInstanceOf[java.lang.reflect.ParameterizedType].getActualTypeArguments.head.asInstanceOf[Class[_]]java.lang.String

ただし、型パラメーターが (Java では許可されていないが、Scala では許可されている) などのプリミティブ型である場合class NewClass(val a: Seq[Int])、同じアプローチを使用しても のみが生成されjava.lang.Objectます。それが実際にInt一般的なものではないことを知る方法はありますjava.lang.Objectか?

4

2 に答える 2

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
于 2012-11-25T23:40:06.383 に答える
0

以下のようにバージョンを定義すると、1 つの型パラメーターを持つすべてのクラスで機能します。

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
于 2012-11-26T04:24:16.227 に答える