2

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

但是,如何在不知道它在哪里声明的情况下检查任意对象的相同内容呢?

4

2 回答 2

2

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

于 2012-10-03T16:01:56.710 回答
2

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

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

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

于 2012-10-03T18:14:12.693 回答