我在网上的一些地方看到它提到,在某些情况下,可以使用反射 API 来获取有关泛型数据类型的信息,我认为这些信息会通过类型擦除而丢失。
我正在寻找类型擦除不完整的情况的完整列表,即仍然可以通过反射访问某些内容。可以获取泛型类型的示例和相关反射代码的良好列表将非常好。
更新 http://tutorials.jenkov.com/java-reflection/generics.html正是我正在寻找的例子。
我在网上的一些地方看到它提到,在某些情况下,可以使用反射 API 来获取有关泛型数据类型的信息,我认为这些信息会通过类型擦除而丢失。
我正在寻找类型擦除不完整的情况的完整列表,即仍然可以通过反射访问某些内容。可以获取泛型类型的示例和相关反射代码的良好列表将非常好。
更新 http://tutorials.jenkov.com/java-reflection/generics.html正是我正在寻找的例子。
我认为它归结为:
没有对象实例存储任何类型信息。
然而,这些类保留了它们所有的泛型签名(否则在编译时你不能进行任何泛型类型检查)
因此,使用反射,您可以读取给定类的泛型类型信息。
例子:
class MyList extends ArrayList<MyObject>{}
List<MyObject> x = new MyList();
反射会告诉你这是一个 MyObject 的 List(因为这个信息被编译到了 MyList 类中)。
但
List<MyObject> x = new ArrayList<MyObject>();
反射不会告诉您任何有用的信息(因为 ArrayList类对 MyObject 一无所知)。
一般的想法是,如果您创建一个命名或匿名类,该类是泛型类型的子类,类型参数具有特定类型,那么该子类不是泛型且不受类型擦除的影响。假设您可以获取Class
子类的对象,您可以对该对象使用反射来找出参数类型是什么。
仔细想想,这并不是擦除规则的真正“例外”。相反,它通过明确具体化来安排所讨论的类不是通用的。