我知道如何使用反射访问泛型类型的字段:只需检查field.getGenericType() instanceof ParameterizedType
。
但是如何检查任意对象的相同内容,而不知道它的声明位置?
答案 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()
以获取通用信息。