繁体   English   中英

在Java中键入擦除有哪些例外?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM