所以我在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 */
答案 0 :(得分:7)
由于类型擦除,您无法从实例中获取此信息。在运行时,XXX<T>
实际上只是XXX
。除非班级做出特殊安排来存储T的Class引用,否则它将完全彻底地消失。
您可以从getDeclaredFields()获取它。你必须在Field上调用getGenericType,而不是getType,然后你必须对ParameterizedType进行一些转换,然后向它询问你想要的参数。
答案 1 :(得分:1)
您可以通过查看Collection
中的一个元素来获取SomeTypeCollection<String> abc = new ArrayList<String>();
for ( Object x : abc ) { String className = x.getClass().getName(); break; }