例如,如果我有一個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]中獲取原始類型參數的實際類型?
0
A
回答
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
相關問題
- 1. 如何獲取Kotlin中實際泛型參數的實際類型參數?
- 2. T類型參數
- 3. Scala:實現數字的子類型[T]
- 4. 將Seq [Option [T]]轉換爲Seq [T]
- 5. 使用Scala泛型:類[T]不參數
- 6. Scala的類型:A類不等於,其中T爲T:類型T = A
- 7. 在通用列表中獲取T的實際類型<T>
- 8. 獲取Scala類型的類型參數
- 9. 如何從<T>類方法的參數實際類類型
- 10. 從scala的類型獲取參數化類型?
- 11. 從StackFrame獲取類型T
- 12. 爲CPS類實現Seq [T]
- 13. 類型參數 - 從獲取類型T的具體類型:IMyInterface的
- 14. 疑難解答「類型參數T隱藏類型T」警告
- 15. Scala的類型加寬/推理[T](T,T):T
- 16. 原始類型/ T無法解析
- 17. T的類型forSome {type T}
- 18. 如何在Android 2.10.1上獲得Option [T]字段類型?
- 19. 從Seq [Option [T]]到Option [Seq [T]]的「自然」函數是否有名稱?
- 20. 如何創建一個接受任何Seq [T,Int]並返回Seq原始類型的函數。
- 21. 斯卡拉 - 類型T的參數或=> T
- 22. 如何獲得泛型類之外的實際泛型參數?
- 23. 類型「」不能被用作類型參數「在通用類型或方法T」
- 24. 如何在Scala類中初始化函數類型參數?
- 25. 在宏實現中獲取弱類型的類型參數
- 26. BarRenderer是一種原始類型。參考泛型BarRenderer <T>應參數化?
- 27. 如何獲取泛型參數類型的類實例
- 28. 如何才能學習泛型類的實際類型參數?
- 29. Scala:類參數中的抽象類型
- 30. Eclipse警告 - 類是原始類型。引用泛型類型類<T>應該是參數
Manifest是最簡單的解決方案,但是您已經指出代碼已生成並且不起作用。我可以問你爲什麼需要這種類型?你可以發佈一些上下文嗎?也許還有另一種解決方案。 –
我正在嘗試爲我們的節儉服務創建一個基於Web的節儉客戶端,該服務實現了由Scrooge生成的接口。現在看來現在最好的解決方案是修改Scrooge以某種形式生成Manifest。 – ximyu