java 泛型 假 为什么

阅读: 评论:0

java 泛型 假 为什么

java 泛型 假 为什么

相关阅读

每篇一句

钱就像内裤,你得有,但不必逢人就去证明你有。干事业就像怀孕,得足月,着急了容易流产。你若成功了,放屁都是道理。你若失败了,有道理都是放屁。

说在前面

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

泛型就是参数化类型:

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

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

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

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

可以有:

泛型类型

泛型类

泛型接口

泛型方法

泛型的继承 extends/super

泛型通配符

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

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

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

List list = new ArrayList<>();

list.add(1);

//list.add("a"); // 这样直接添加肯定是不允许的

//下面通过java的反射,绕过泛型 来给添加字符串

Method add = Class().getMethod("add", Object.class);

add.invoke(list,"a");

System.out.println(list); //[1, a] 输出没有没问题

System.out.(1)); //a

}

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

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

Map map = new HashMap<>();

String key = "key";

Integer val = new Integer(1); //备注:此方法在Java9后标注为过期了,建议使用valueOf,使用缓存来提高效率

Method m = DeclaredMethod("put", new Class[]{Object.class, Object.class});

m.invoke(map, key, val);

System.out.println(map); //{key=1}

//但是下面的输出会报错

System.out.(key)); // java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

}

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

最后

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

关注A哥

本文同步分享在 博客“YourBatman”(CSDN)。

如有侵权,请联系 support@oschina 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

本文发布于:2024-01-29 10:17:33,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170649465614584.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:java   泛型
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23