检索集合的类型

时间:2010-03-26 21:49:23

标签: java generics reflection collections

所以我在Java中有以下内容:

private List<SomeType>variable;

// ....variable is instantiated as so ...
variable = new ArrayList<SomeType>();

// there's also a getter
public List<SomeType> getVariable() { /* code */ }

我希望能够做到的是variable是一个SomeType的编程方式的集合。我读了here我可以从方法getVariable()确定这个问题,但有没有办法直接从variable说出来?

我已经能够根据链接中的信息从getter方法中检索SomeType。我也成功地通过SurroundingClass.getClass().getDeclaredFields()检索了周围课程的所有字段,但这并没有告诉我它是List<SomeType>

编辑:基于bmargulies的回应,做到以下将实现我想要的目标:

Field[] fields = SurroundingClass.getDeclaredFields();
/* assuming it is in fields[0] and is a ParameterizedType */
ParameterizedType pt = (ParameterizedType) fields[0].getGenericType(); 
Type[] types = pt.getActualTypeArguments();
/* from types I'm able to see the information I've been looking for */

2 个答案:

答案 0 :(得分:7)

由于类型擦除,您无法从实例中获取此信息。在运行时,XXX<T>实际上只是XXX。除非班级做出特殊安排来存储T的Class引用,否则它将完全彻底地消失。

您可以从getDeclaredFields()获取它。你必须在Field上调用getGenericType,而不是getType,然后你必须对ParameterizedType进行一些转换,然后向它询问你想要的参数。

答案 1 :(得分:1)

您可以通过查看Collection

中的一个元素来获取SomeType
Collection<String> abc = new ArrayList<String>();
for ( Object x : abc ) { String className = x.getClass().getName(); break; }