【小家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泛型更深的理解。

相关文章
|
23天前
|
存储 Java 编译器
深入理解 Java 泛型和类型擦除
【4月更文挑战第19天】Java泛型是参数化类型,增强安全性与可读性,但存在类型擦除机制。类型擦除保证与旧版本兼容,优化性能,但也导致运行时无法访问泛型信息、类型匹配问题及数组创建限制。为应对这些问题,可使用Object类、instanceof运算符,或借助Guava库的TypeToken获取运行时类型信息。
|
5天前
|
安全 Java 程序员
Java 泛型
Java 泛型
10 0
|
6天前
|
Java C++
Java反射的简单使用
Java反射的简单使用
20 3
|
15天前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
2天前
|
存储 安全 Java
掌握8条泛型规则,打造优雅通用的Java代码
掌握8条泛型规则,打造优雅通用的Java代码
掌握8条泛型规则,打造优雅通用的Java代码
|
6天前
|
SQL 存储 Java
【Java反射详解】
【Java反射详解】
11 1
|
10天前
|
Java
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识。入坑JAVA因它的面向对象特性、平台无关性、强大的标准库和活跃的社区支持。
32 2
|
14天前
|
Java 测试技术
滚雪球学Java(24):Java反射
【4月更文挑战第13天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
21 0
滚雪球学Java(24):Java反射
|
15天前
|
安全 Java 编译器
【JAVA】泛型和Object的区别
【JAVA】泛型和Object的区别
|
17天前
|
存储 算法 Java
滚雪球学Java(20):Java泛型与枚举:提升代码灵活性与可读性
【4月更文挑战第9天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
27 1
滚雪球学Java(20):Java泛型与枚举:提升代码灵活性与可读性