在运行时访问对象的泛型类型

时间:2012-10-03 15:45:35

标签: java generics reflection

我知道如何使用反射访问泛型类型的字段:只需检查field.getGenericType() instanceof ParameterizedType

但是如何检查任意对象的相同内容,而不知道它的声明位置?

2 个答案:

答案 0 :(得分:2)

泛型适用于变量声明,方法返回类型等,而不是对象本身。您可以通过Class确定特定对象的myObj.getClass().getTypeParameters()是否使用泛型,但无法确定使用特定对象实例创建的那些类型参数的值。

答案 1 :(得分:2)

对象本身不存储通用信息 ,因此为new ArrayList<Integer>()生成的字节码与new ArrayList<String>()生成的字节码完全相同。我的意思是完全。这就是Java泛型的所谓类型擦除。他们只是去了new ArrayList()

但是,在几乎所有其他情况下,都会保留类型参数,例如字段/参数/返回类型声明。其中一个保留且擦除的情况是类的超类。因此,如果您创建一个扩展ArrayList<String>的类,则可以在运行时访问该信息。

但这似乎有点矫枉过正,不是吗?扩展ArrayList<String>的新类和扩展ArrayList<String>的另一个类似乎不切实际。匿名内部类可以使这更容易。因此,如果您想保留通用信息,只需new ArrayList<String>() {}而不是new ArrayList<String>()。您可以在创建的对象上调用getClass().getGenericSuperclass()以获取通用信息。