3

我在网上的一些地方看到它提到,在某些情况下,可以使用反射 API 来获取有关泛型数据类型的信息,我认为这些信息会通过类型擦除而丢失。

我正在寻找类型擦除不完整的情况的完整列表,即仍然可以通过反射访问某些内容。可以获取泛型类型的示例和相关反射代码的良好列表将非常好。

更新 http://tutorials.jenkov.com/java-reflection/generics.html正是我正在寻找的例子。

4

2 回答 2

8

我认为它归结为:

  • 没有对象实例存储任何类型信息。

  • 然而,这些类保留了它们所有的泛型签名(否则在编译时你不能进行任何泛型类型检查)

因此,使用反射,您可以读取给定类的泛型类型信息。

例子:

 class MyList extends ArrayList<MyObject>{}

 List<MyObject> x = new MyList();

反射会告诉你这是一个 MyObject 的 List(因为这个信息被编译到了 MyList 类中)。

List<MyObject> x = new ArrayList<MyObject>();

反射不会告诉您任何有用的信息(因为 ArrayList对 MyObject 一无所知)。

于 2012-08-06T05:35:31.890 回答
2

一般的想法是,如果您创建一个命名或匿名类,该类是泛型类型的子类,类型参数具有特定类型,那么该子类不是泛型且不受类型擦除的影响。假设您可以获取Class子类的对象,您可以对该对象使用反射来找出参数类型是什么。

仔细想想,这并不是擦除规则的真正“例外”。相反,它通过明确具体化来安排所讨论的类不是通用的。

于 2012-08-06T05:35:58.867 回答