簡體   English   中英

如何在Clojure中從Java聲明的字段中獲取數組元素的類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM