我知道如何使用反射访问通用类型的字段:只需检查 if field.getGenericType() instanceof ParameterizedType
.
但是,如何在不知道它在哪里声明的情况下检查任意对象的相同内容呢?
我知道如何使用反射访问通用类型的字段:只需检查 if field.getGenericType() instanceof ParameterizedType
.
但是,如何在不知道它在哪里声明的情况下检查任意对象的相同内容呢?
泛型适用于变量声明、方法返回类型等,而不是对象本身。您可以通过来确定Class
特定对象的 是否使用泛型,myObj.getClass().getTypeParameters()
但无法确定创建特定对象实例时使用的这些类型参数的值。
对象本身不存储通用信息,因此生成的字节码与 fornew ArrayList<Integer>()
完全相同new ArrayList<String>()
。我的意思是准确的。这就是所谓的 Java 泛型类型擦除。他们只是去糖了new ArrayList()
。
但是,在几乎所有其他情况下,都会保留类型参数,例如字段/参数/返回类型声明。保留而不删除的情况之一是类的超类。因此,如果您创建一个扩展类,ArrayList<String>
您可以在运行时访问该信息。
但这似乎有点矫枉过正,不是吗?一个扩展的新类ArrayList<String>
和另一个扩展的类ArrayList<String>
等似乎不切实际。匿名内部类可以使这更容易。所以,如果你想保留通用信息,你只需要做,new ArrayList<String>() {}
而不是new ArrayList<String>()
. 您可以调用getClass().getGenericSuperclass()
创建的对象来获取通用信息。