一、泛型
1.1、泛型介绍:
什么是“泛型”???“泛型”的作用是什么???
我们都知道 Object 是所有类的父类,因此我们可以设置一个 Object 数组来接收所有的类,并设置相对应的数据类型从这个 Object 数组里面获取到相对应类型的元素。理论上来说是可以的:::
当我们完成上述代码并运行时会发现:类型不匹配的问题!这就是因为虽然我们知道下标为 0 的元素是 String类型的“hello”,但对于这个数组来说存放的不止 String 一种类型,所以系统无法判定是否正确。因此要想解决这种问题只需要 强制类型转换 即可:
此时就不会再报错。但是这种办法更为麻烦:因此就会引入 “泛型”
上述代码就简单的实现了一个 泛型类 ,
-
class NewMyArray<T>
这里的 <T> 表示 占位符:表示当前类是一个泛型类; -
NewMyArray<Integer> myArray = new NewMyArray<>();
NewMyArray后面要指定类型,但是后面则不需要加,因为后面可以根据前面的类型来推导; - 不需要强制类型转换;
1.2、擦除机制
在 泛型代码 编译的过程中会将所有的 T类型 都转换为 Object类型 ,这就是“擦除机制”。
这里还涉及到T[] t = new T[10]
为什么会报错呢?难道不是等同于Object[] object = new Object[10]
吗?
这里就涉及到 “擦除机制” ,因为在代码编译的时候 T类型 会被擦除为 Object类型 然而在返回的时候: Object数组 里面存放的一定是 Integer类型 的吗???因此在这里如果直接用 Integer类型数组 接收编译器认为是不安全的
1.3、泛型上界
在“寻找数组最大值”的代码里面if(max < array[i])
代码报错:这是因为代码在编译时 T类型被擦除为了 Object类型 ,但是 Object 没有实现 Comparable 的接口,因此在这里就不能对当前类进行 implements 操作。由此就引出 “泛型上界”:通过对类型的边界进行约束,
通过 extends 来实现 Comparable 使两个数据进行比较:而对于其他数据来说:只要实现了 Comparable 接口,都可以调用这个方法。
在新创建的Person类里面,因为 Person 实现了 Comparable接口 ,因此在findMax方法可以接收这个类型。
1.4、通配符
这里使用 通配符 就可以传递任何参数。
1.4.1、通配符上界 与 下界
上界:<? extends 上界>
:不能写入数据,只能读取数据
下界:<? super 下界>
:不能读取数据,只能写入数据
1.5、包装类
装箱:
上述代码中出现的问题是为什么???