🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
本文内容如下:
1、 什么是类型擦除
2、常用的 ?, T, E, K, V, N的含义
3、上界通配符 < ?extends E>
4、下界通配符 < ?super E>
5、什么是PECS原则
6、通过一个案例来理解 ?和 T 和 Object 的区别
一、什么是类型擦除?
我们说Java的泛型是伪泛型,那是因为泛型信息只存在于代码编译阶段,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程为类型擦除。
泛型是Java 1.5版本才引进的概念,在这之前是没有泛型的,但是因为类型擦除特性,让泛型代码能够很好地和之前版本的代码兼容。
我们来看个案例
(图1)
因为这里泛型定义为Integer类型集合,所以添加String的时候在编译时期就会直接报错。
那是不是就一定不能添加了呢?答案是否定的,我们可以通过Java泛型中的类型擦除特点及反射机制实现。
如下
public static void main(String[] args) throws Exception {
ArrayList list = new ArrayList();
list.add(6);
//反射机制实现
Class <span class="hljs-keyword"extends ArrayList> clazz = list.getClass();
Method add = clazz.getDeclaredMethod("add", Object.class);
add.invoke(list, "欢迎关注:后端元宇宙");
System.out.println("list = " + list);
}
运行结果
list = [6, 欢迎关注:后端元宇宙]
二、案例实体准备
这里先建几个实体,为后面举例用
Animal类
@Data
@AllArgsConstructor
public class Animal {
/**
* 动物名称
*/
private String name;
/**
* 动物毛色
*/
private String color;
}