[英]What are the exceptions to type erasure in Java?
我在网上的某些地方看到它提到在某些情况下可以使用反射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
对象,则可以对该对象使用反射来查找参数类型。
当你考虑它时,这实际上并不是擦除规则的“例外”。 相反,它通过明确地对它进行安排来安排所讨论的类不是通用的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.