【小家java】为什么说Java中的泛型是“假”的?(通过反射绕过Java泛型)

简介: 【小家java】为什么说Java中的泛型是“假”的?(通过反射绕过Java泛型)

说在前面


泛型是JDK5带给我们的新特性,虽然它处于历史原因,有不完善的地方。但是更多的还是给与我们带来方便的。下面先简要先说说它的优点:


泛型就是参数化类型:


   适用于多种数据类型执行相同的代码

   泛型中的类型在使用时指定

   泛型归根到底就是“模版”


优点:使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换。提高安全性。

可以有:


   泛型类型


   泛型类


   泛型接口


   泛型方法


   泛型的继承 extends/super


   泛型通配符


为什么说Java的泛型是"假"的呢?


其实Java为了向下兼容,提出来的泛型只是一个语法糖,并不是像c++那样是真的泛型。下面我通过两个简单的例子,可以让大家感受一下:


   public static void main(String[] args) throws Exception {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        //list.add("a"); // 这样直接添加肯定是不允许的
        //下面通过java的反射,绕过泛型  来给添加字符串
        Method add = list.getClass().getMethod("add", Object.class);
        add.invoke(list,"a");
        System.out.println(list); //[1, a] 输出没有没问题
        System.out.println(list.get(1)); //a
    }


这里面就证明了虽然List声明为只能装Integer类型,但是我却放进去了字符串类型,由此课件,泛型是“假”的,只存在于编译期。再看一个例子:


  public static void main(String[] args) throws Exception {
        Map<String, String> map = new HashMap<>();
        String key = "key";
        Integer val = new Integer(1); //备注:此方法在Java9后标注为过期了,建议使用valueOf,使用缓存来提高效率
        Method m = HashMap.class.getDeclaredMethod("put", new Class[]{Object.class, Object.class});
        m.invoke(map, key, val);
        System.out.println(map); //{key=1}
        //但是下面的输出会报错
        System.out.println(map.get(key)); // java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    }


此处需要注意了,虽然1放进去了。但是get出来的时候会报错,因为强转失败


最后


虽然java中的泛型是“假”的,会有泛型擦除的操作,但是不可否则,泛型的引入对java语言影响还是挺大的,让它上升了一大步,所以本文借两个例子,希望能够加强读者对java泛型更深的理解。

相关文章
|
6月前
|
安全 IDE Java
重学Java基础篇—Java泛型深度使用指南
本内容系统介绍了Java泛型的核心价值、用法及高级技巧。首先阐述了泛型在**类型安全**与**代码复用**中的平衡作用,解决强制类型转换错误等问题。接着详细讲解了泛型类定义、方法实现、类型参数约束(如边界限定和多重边界)、通配符应用(PECS原则)以及类型擦除的应对策略。此外,还展示了泛型在通用DAO接口、事件总线等实际场景的应用,并总结了命名规范、边界控制等最佳实践。最后探讨了扩展知识,如通过反射获取泛型参数类型。合理运用泛型可大幅提升代码健壮性和可维护性,建议结合IDE工具和单元测试优化使用。
147 1
|
9月前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
10月前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
104 5
|
12月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
198 9
Java——反射&枚举
|
10月前
|
Java
Java的反射
Java的反射。
94 2
|
Java 编译器 容器
Java——包装类和泛型
包装类是Java中一种特殊类,用于将基本数据类型(如 `int`、`double`、`char` 等)封装成对象。这样做可以利用对象的特性和方法。Java 提供了八种基本数据类型的包装类:`Integer` (`int`)、`Double` (`double`)、`Byte` (`byte`)、`Short` (`short`)、`Long` (`long`)、`Float` (`float`)、`Character` (`char`) 和 `Boolean` (`boolean`)。包装类可以通过 `valueOf()` 方法或自动装箱/拆箱机制创建。
130 9
Java——包装类和泛型
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
11月前
|
存储 安全 Java
🌱Java零基础 - 泛型详解
【10月更文挑战第7天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
96 1
|
11月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
138 2
|
11月前
|
Java 语音技术 容器
java数据结构泛型
java数据结构泛型
87 5