如何在Clojure中从Java中声明的字段中获取数组元素的类型



以下代码

(-> (.getField (Class/forName
                "ccg.flow.processnodes.text.retrievers.Dictionary.Dictionary")
     "wordsTuples") .getType)

告诉我wordsTuplesjava.util.ArrayList。但我想知道的是,它是一个数组列表类型的元素String[] ,因为它恰好是这样声明的:

public class Dictionary extends ProcessNode {
    public ArrayList<String[]> wordsTuples;
    public ArrayList<String> words;
...

是否有一种方法可以在Clojure中以编程方式获得"类型提示"信息?

不能,因为类型擦除。https://docs.oracle.com/javase/tutorial/java/generics/erasure.html

谷歌上有大量关于你的删除的数据

您可以根据列表中的数据使用一个简单的hack。

。你得到了一些字符串列表:

(def lst (java.util.ArrayList. ["my" "list" "of" "strings"]))

然后你可以得到type of item:

(if (and (instance? java.util.List lst) 
         (not (.isEmpty lst))) 
   (.getName (.getClass (.get lst 0))))

这个解决方法的缺点是,你不能得到反射信息关于空列表b/c的擦除freakhill提到的,但谁关心空列表;)?

感谢评论,我找到了这个问题的答案java.util.List。从这里开始,对我的示例代码进行一个简单的修改,现在可以按预期工作了:

(-> (.getField (Class/forName
             "ccg.flow.processnodes.text.retrievers.Dictionary.Dictionary")
     "wordsTuples") .getGenericType)

的回报:

#<ParameterizedTypeImpl java.util.ArrayList<java.lang.String[]>>

相关内容

  • 没有找到相关文章

最新更新