千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:深圳千锋IT培训  >  技术干货  >  泛型擦除是什么,会带来什么问题?

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

来源:千锋教育
发布人:xqq
时间: 2023-10-15 00:34:12

一、泛型擦除

泛型擦除介绍

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();

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

MySQL LEFT JOIN 和 JOIN查询有什么区别?

2023-10-15

oracle19c与oracle12c有哪些区别?

2023-10-15

J2EE有什么用?

2023-10-15

最新文章NEW

mysql字符串内部是怎么比较大小的?

2023-10-15

mysql中,逻辑删除对索引以及性能会造成什么影响?

2023-10-15

什么是 ZIP 文件,工作机制是什么?

2023-10-15

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>