全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

泛型擦除是什么,会带来什么问题?

发布时间:2023-10-11 19:59:03
发布人:xqq

一、泛型擦除

泛型擦除介绍

Java 的泛型是伪泛型,这是因为 Java 在运行期间,所有的泛型信息都会被擦掉,这也就是通常所说类型擦除。Java 泛型(generics) 是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制。该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

List list = new ArrayList<>();

list.add(12);

//这里直接添加会报错

list.add(“a”);

Class clazz = list.getClass();

Method add = clazz.getDeclaredMethod(“add”, Object.class);

//但是通过反射添加是可以的

//这就说明在运行期间所有的泛型信息都会被擦掉

add.invoke(list, “kl”);

System.out.println(list);

带来什么样的问题

(1) 强制类型转化

这个问题的结果我们已经在上述文章中提及到了,通过反射的方式去进行插入的时候,我们的数据就会发生错误。

如果我们在一个List中在不知情的情况下插入了一个String类型的数值,那这种重大错误,我们该找谁去说呢。

(2)引用传递问题

上面的问题中,我们已经说过了T将在后期被转义成Object,那我们对引用也进行一个转化,是否行得通呢?

List listObject = new ArrayList();

List listObject = new ArrayList();

如果你这样写,在我们的检查阶段,会报错。但是从逻辑意义上来说,其实你真的有错吗?

假设说我们的名列前茅种方案是正确的,那么其实就是将一堆Object数据存入,然后再由上面所说的强制转化一般,转化成String类型,听起来完全ok,因为在List中本来存储数据的方式就是Object。但其实是会出现ClassCastException的问题,因为Object是万物的基类,但是强转是为子类向父类准备的措施。

再来假设说我们的第二种方案是正确的,这个时候,根据上方的数据String存入,但是有什么意义存在呢?最后都还是要成Object的,你还不如就直接是Object。

延伸阅读:

二、继承型的用处是什么

其实他期待的就是这整个列表的数据的基础都是来自我们的Parent,这样获取的数据全部人的父类其实都是来自于我们的Parent了,你可以叫这个列表为Parent家族。所以也可以说这是一个适合频繁读取的方案。

Plate p1=new Plate(new Apple());

Plate p2=new Plate(new Beef()); // 检查不通过

// 修改数据不通过

p1.set(new Banana());

// 数据获取一切正常

// 但是他只能精确到由我们定义的Fruit

Fruit result = p1.get();

#it技术干货

相关文章

Web前端三大主流框架是什么,优点和缺点是什么?

Web前端三大主流框架是什么,优点和缺点是什么?

2023-10-11
npm install –global、–save、–save-dev的区别?

npm install –global、–save、–save-dev的区别?

2023-10-11
Python传参传什么?

Python传参传什么?

2023-10-11
Java的各种集合为什么不安全?

Java的各种集合为什么不安全?

2023-10-11

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09