Java泛型与类型擦除

“编译器会进行泛型擦除”是一个常识了(好吧,实际擦除的是参数和自变量的类型)。这个过程由“类型擦除”实现。但是并非像许多开发者认为的那样,在 <..> 符号内的东西都被擦除了。看下面这段代码:


public class ClassTest {

public static void main(String[] args) throws Exception {

ParameterizedType type = (ParameterizedType)

Bar.class.getGenericSuperclass();

System.out.println(type.getActualTypeArguments()[0]);

ParameterizedType fieldType = (ParameterizedType)

Foo.class.getField("children").getGenericType();

System.out.println(fieldType.getActualTypeArguments()[0]);

ParameterizedType paramType = (ParameterizedType)

Foo.class.getMethod("foo", List.class)

.getGenericParameterTypes()[0];

System.out.println(paramType.getActualTypeArguments()[0]);

System.out.println(Foo.class.getTypeParameters()[0]

.getBounds()[0]);

}

class Foo<E extends CharSequence> {

public List<Bar> children = new ArrayList<Bar>();

public List<StringBuilder> foo(List<String> foo) {return null; }

public void bar(List<? extends String> param) {}

}

class Bar extends Foo<String> {}

}

  你知道输出了什么吗?

  class java.lang.String

  class ClassTest$Bar

  class java.lang.String

  class java.lang.StringBuilder

  interface java.lang.CharSequence

  你会发现每一个类型参数都被保留了,而且在运行期可以通过反射机制获取到。那么到底什么是“类型擦除”?至少某些东西被擦除了吧?是的。事实上,除了结构化信息外的所有东西都被擦除了 —— 这里结构化信息是指与类结构相关的信息,而不是与程序执行流程有关的。换言之,与类及其字段和方法的类型参数相关的元数据都会被保留下来,可以通过反射获取到。\

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-07 15:04:42

Java泛型与类型擦除的相关文章

java 泛型的类型擦除与桥方法

java 泛型 学习java泛型的笔记,详细写明白在学习泛型的过程中的笔记心得等: 泛型类 泛型方法 类型擦除(Type Erasure) 桥方法 泛型类 代码参考:java核心技术 卷1 第十版 public class Pair<T> { private T first; private T second; //构造器 public Pair() { first = null; second = null;} public Pair(T first , T second ) {this.f

JAVA集合泛型,类型擦除,类型通配符上限之类的知识点

感觉定义要比PYTHON严谨很多,一切源于静态语言的特点吧.. 于是语法上就复杂很多,值不值得呢? 参考测试URL: http://www.cnblogs.com/lwbqqyumidi/p/3837629.html   import java.util.*; public class TestCollection { public static void main(String args[]) { List<String> list = new ArrayList<String>

浅谈java泛型的作用及其基本概念_java

一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中的ArrayList<Integer>和ArrayList<String>是同一个类型,在编译时会执行类型擦除,及java中的类型是伪泛型,伪泛型将会在后面介绍,其次,对于像集合中添加基本类型的数据时,例如int,会首先将int转化成Integer对象,即我们通常所说的装箱操作,在取出

java 泛型 类型擦除-Java 核心技术中泛型的使用

问题描述 Java 核心技术中泛型的使用 在看Java核心技术的过程中有个问题不明白,求各位大神指导. 书中写到: 不能构造一个泛型数组: public static T[] minmax(T[] a) { T[] mm = new T(2); ... } 书中的解释是类型擦除会让这个方法永远构造Object[2]数组. 什么叫永远构造Object[2]数组?是死循环?还是说构造的是Object[2]数组而不是T[2]数组 解决方案 说构造的是Object[2]数组而不是T[2]数组

java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

参考:java核心技术 一.Java泛型的实现方法:类型擦除 前面已经说了,Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首要前提是理解类型擦出(type erasure). Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节码中是不包含泛型中的类型信息的.使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉.这个过程就称为类型擦除. 如在代码中定义的List<object>和List<

java 泛型擦除发生在哪个阶段,如何用反编译工具查看泛型擦除后的代码?

问题描述 java 泛型擦除发生在哪个阶段,如何用反编译工具查看泛型擦除后的代码? 有如下的泛型类: public class Pair { public Pair() { first = null; second = null; } public Pair(T first, T second) { this.first = first; this.second = second; } public T getFirst() { return first; } public T getSecon

Java 8 新特性之泛型的类型推导

1. 泛型究竟是什么? 在讨论类型推导(type inference)之前,必须回顾一下什么是泛型(Generic).泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法的创建中.理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: List<Apple> box = new ArrayList<Ap

java泛型type体系整理

一直对jdk的ref使用比较模糊,早上花了点时间简单的整理了下,也帮助自己理解一下泛型的一些处理.   java中class,method,field的继承体系     java中所有对象的类型定义类Type   说明:    Type :  Type is the common superinterface for all types in the Java programming language. These include raw types, parameterized types, 

Java泛型--泛型入门

1.认识泛型 按照此定义格式,定义一个point类. class Point<T>{ // 此处可以随便写标识符号,T是type的简称 private T var ; // var的类型由T指定,即:由外部指定 public T getVar(){ // 返回值的类型由外部决定 return var ; } public void setVar(T var){ // 设置的类型也由外部决定 this.var = var ; } }; class Point<T>{ // 此处可以随