[英]How to get type of array elements, in Clojure, from fields declared in Java?
以下代碼
(-> (.getField (Class/forName
"ccg.flow.processnodes.text.retrievers.Dictionary.Dictionary")
"wordsTuples") .getType)
告訴我wordsTuples
是一個java.util.ArrayList
。 但是我想學習的是它是一個具有String[]
類型元素的ArrayList ,因為它恰好是這樣聲明的:
public class Dictionary extends ProcessNode {
public ArrayList<String[]> wordsTuples;
public ArrayList<String> words;
...
有沒有辦法在Clojure中以編程方式獲取“類型提示”信息?
不,因為類型擦除。 https://docs.oracle.com/javase/tutorial/java/generics/erasure.html
您在Google上的擦除數據很多。
您可以根據列表中的數據事實使用簡單的技巧。
例如,您有一些字符串列表:
(def lst (java.util.ArrayList. ["my" "list" "of" "strings"]))
然后,您可以獲得項目的類型:
(if (and (instance? java.util.List lst)
(not (.isEmpty lst)))
(.getName (.getClass (.get lst 0))))
此解決方法的缺點是您無法獲得freakhill提及的有關擦除的空白列表b / c的反射信息,但是誰在乎空白列表;)?
希望這可以幫助。
多虧了這些評論,我找到了關於問題java.util.List的通用類型的 答案 。 從那里開始,對示例代碼的簡單修改即可按需工作:
(-> (.getField (Class/forName
"ccg.flow.processnodes.text.retrievers.Dictionary.Dictionary")
"wordsTuples") .getGenericType)
返回值:
#<ParameterizedTypeImpl java.util.ArrayList<java.lang.String[]>>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.