2012-11-25 28 views
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如何在Scala Seq [T]或Option [T]中獲取原始類型參數的實際類型?

+1

Manifest是最簡單的解決方案,但是您已經指出代碼已生成並且不起作用。我可以問你爲什麼需要這種類型?你可以發佈一些上下文嗎?也許還有另一種解決方案。 –

+0

我正在嘗試爲我們的節儉服務創建一個基於Web的節儉客戶端,該服務實現了由Scrooge生成的接口。現在看來現在最好的解決方案是修改Scrooge以某種形式生成Manifest。 – ximyu

回答

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] = [email protected] 

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

我知道這個作品。但不幸的是,我使用Scrooge生成的來自節儉的Scala代碼,它不使用Manifest ... – ximyu

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 
相關問題