以下代码
(-> (.getField (Class/forName
"ccg.flow.processnodes.text.retrievers.Dictionary.Dictionary")
"wordsTuples") .getType)
告诉我wordsTuples
是java.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[]>>