什么是泛型擦除

简介: 什么是泛型擦除

我们都知道Java的泛型是伪泛型,即编译期间所有的泛型信息都会被擦除,如我们代码定义了:List和List,但是对于JVM而言,看到的只有List,由泛型附加的类型信息对于JVM而言是看不到的。代码说明如下:
1.1 原始类型擦除后相等
public class Test {
public static void main(String[] args) {
ArrayList list1 = new ArrayList();
list1.add("abc");
    ArrayList<Integer> list2 = new ArrayList<Integer>();
    list2.add(123);

    System.out.println(list1.getClass() == list2.getClass());
}

}
在这个例子中,我们定义了两个ArrayList数组,不过一个是ArrayList泛型类型的,只能存储字符串;一个是ArrayList泛型类型的,只能存储整数,最后,我们通过list1对象和list2对象的getClass()方法获取他们的类的信息,最后发现结果为true。说明泛型类型String和Integer都被擦除掉了,只剩下原始类型。
1.2 反射添加的元素被擦除
public static void main(String[] args)
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
ArrayList list = new ArrayList();
list.add(1); //这样调用 add 方法只能存储整形,因为泛型类型的实例为 Integer
list.getClass().getMethod("add", Object.class).invoke(list, "asd");

    for (int i = 0; i < list.size(); i++) {
        // 输出1    asd
        System.out.println(list.get(i));
    }
}

如果直接调用add()方法,那么只能存储整数数据,不过当我们利用反射调用add()方法的时候,却可以存储字符串,这说明了Integer泛型实例在编译之后被擦除掉了,只保留了原始类型。

相关文章
|
1月前
|
Java 编译器
泛型擦除与多态的冲突与解决方法
泛型擦除与多态的冲突与解决方法
什么是泛型擦除后保留的原始类型
什么是泛型擦除后保留的原始类型
|
11月前
|
存储 安全 Java
Java一分钟之-泛型擦除与类型安全
【5月更文挑战第20天】Java泛型采用类型擦除机制,在编译期间移除泛型信息,但在编译阶段提供类型安全检查。尽管需要类型转换且可能产生警告,但可以通过特定语法避免。使用泛型时应注意自动装箱拆箱影响性能,无界通配符仅允许读取。理解这些特性有助于编写更安全的代码。
111 4
|
10月前
|
Java API Go
JavaSE——面向对象高级三(5/5)-泛型方法、泛型的通配符、泛型擦除和注意事项
JavaSE——面向对象高级三(5/5)-泛型方法、泛型的通配符、泛型擦除和注意事项
46 0
|
11月前
|
设计模式 安全 Java
详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)
详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)
140 0
|
存储 安全 Java
Java泛型详解:为什么使用泛型?如何使用泛型?
Java泛型详解:为什么使用泛型?如何使用泛型?
200 0
|
存储 安全 Java
Java泛型01:什么是泛型?
Java泛型01:什么是泛型?
127 0
Java泛型01:什么是泛型?
DHL
|
存储 算法 Java
90%人不懂的泛型局限性,泛型擦除,星投影
通过这篇文章你将学习 Kotlin 和 Java 泛型局限性、泛型擦除,泛型信息被擦除了之后,泛型信息保存到哪里,迷惑的通配符和星投影区别
DHL
226 0
90%人不懂的泛型局限性,泛型擦除,星投影
|
存储 Java 编译器
泛型(泛型擦除)
泛型 1.什么是泛型 2.泛型类、泛型接口、泛型方法 3.为什么要使用泛型,泛型的好处 4.使用泛型注意点 5.泛型擦除
405 0
泛型(泛型擦除)
|
Java
【Java 泛型】使用上下边界通配符解决泛型擦除问题
【Java 泛型】使用上下边界通配符解决泛型擦除问题
262 0

热门文章

最新文章

下一篇
oss创建bucket