Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的类型擦除有哪些例外?_Java_Generics_Reflection_Type Erasure - Fatal编程技术网

Java中的类型擦除有哪些例外?

Java中的类型擦除有哪些例外?,java,generics,reflection,type-erasure,Java,Generics,Reflection,Type Erasure,我在网上的一些地方看到它提到,在某些情况下,可以使用反射API来获取有关泛型数据类型的信息,我认为这些信息会因为类型擦除而丢失 我正在寻找类型擦除不完整的情况的完整列表,即通过反射仍然可以访问某些内容。一个很好的示例列表和相关的反射代码,可以获得泛型类型,这将是非常好的 更新正好有我想要的例子 我想这就是问题的症结所在: 没有对象实例存储任何类型信息 但是,这些类保留了它们的所有泛型签名(否则在编译时不能进行任何泛型类型检查) 因此,使用反射,您可以读取给定类的泛型类型信息 例如: cla

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

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


更新正好有我想要的例子

我想这就是问题的症结所在:

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

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

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

例如:

 class MyList extends ArrayList<MyObject>{}

 List<MyObject> x = new MyList();
class MyList扩展了ArrayList{}
列表x=新的MyList();
反射将告诉您这是MyObject的列表(因为这些信息被编译到MyList类中)

但是

List x=new ArrayList();

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

一般的想法是,如果您创建一个命名或匿名类,该类是泛型类型的子类,并且具有特定类型的类型参数,那么该子类就不是泛型的,并且不会进行类型擦除。假设您可以获得子类的
对象,您可以使用该对象上的反射来找出参数类型


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

如果您投票关闭此问题,请发表评论并告诉我原因?指向这些位置的链接将很有帮助。@Thilo是一个地方的例子,其中提到并非所有类型信息都丢失。+1保留任何泛型信息的原因是为了
javac
编译器来完成它的工作。e、 g.您必须能够使用已经正确编译的代码中的泛型来编译代码。除了超类之外,非私有字段类型中的泛型、方法参数和返回类型中的泛型也都在那里,用于类型检查。是的,所有这些都是类定义的一部分。上面的例子并不意味着详尽无遗。但请注意,在所有这些情况下,泛型都可用于字段/参数/返回类型定义(签名),而不是用于分配给它们的任何对象的实际运行时值..“要了解参数类型是什么”否,您需要了解它扩展的超类的类型参数。
List<MyObject> x = new ArrayList<MyObject>();