一、泛型

1.1、泛型介绍:

什么是“泛型”???“泛型”的作用是什么???

我们都知道 Object 是所有类的父类,因此我们可以设置一个 Object 数组来接收所有的类,并设置相对应的数据类型从这个 Object 数组里面获取到相对应类型的元素。理论上来说是可以的:::

数据结构:泛型_泛型

当我们完成上述代码并运行时会发现:类型不匹配的问题!这就是因为虽然我们知道下标为 0 的元素是 String类型的“hello”,但对于这个数组来说存放的不止 String 一种类型,所以系统无法判定是否正确。因此要想解决这种问题只需要 强制类型转换 即可:

数据结构:泛型_擦除机制_02

此时就不会再报错。但是这种办法更为麻烦:因此就会引入 “泛型”

class NewMyArray<T>{
public T[] array = (T[]) new Object[10];

//给数组设置元素
public void setArray(int pos,T val){
array[pos] = val;
}
//取出数组元素
public T getArray(int pos){
return array[pos];
}
}
public class Test2 {
public static void main(String[] args) {
NewMyArray<Integer> myArray = new NewMyArray<>();
myArray.setArray(1,20);
Integer num = myArray.getArray(1);
System.out.println(num);
}
}

上述代码就简单的实现了一个 泛型类 ,

  • ​class NewMyArray<T>​​这里的 <T> 表示 占位符:表示当前类是一个泛型类;
  • ​NewMyArray<Integer> myArray = new NewMyArray<>();​​NewMyArray后面要指定类型,但是后面则不需要加,因为后面可以根据前面的类型来推导;
  • 不需要强制类型转换;

1.2、擦除机制

在 泛型代码 编译的过程中会将所有的 T类型 都转换为 Object类型 ,这就是“擦除机制”。

这里还涉及到​​T[] t = new T[10]​​​为什么会报错呢?难道不是等同于​​Object[] object = new Object[10]​​吗?

数据结构:泛型_通配符上下界_03

这里就涉及到 “擦除机制” ,因为在代码编译的时候 T类型 会被擦除为 Object类型 然而在返回的时候 Object数组 里面存放的一定是 Integer类型 的吗???因此在这里如果直接用 Integer类型数组 接收编译器认为是不安全的

1.3、泛型上界

数据结构:泛型_擦除机制_04

在“寻找数组最大值”的代码里面​​if(max < array[i])​​代码报错:这是因为代码在编译时 T类型被擦除为了 Object类型 ,但是 Object 没有实现 Comparable 的接口,因此在这里就不能对当前类进行 implements 操作。由此就引出 “泛型上界”:通过对类型的边界进行约束,

数据结构:泛型_通配符上下界_05

通过 extends 来实现 Comparable 使两个数据进行比较:而对于其他数据来说:只要实现了 Comparable 接口,都可以调用这个方法。

数据结构:泛型_泛型上下界_06

在新创建的Person类里面,因为 Person 实现了 Comparable接口 ,因此在findMax方法可以接收这个类型。

1.4、通配符

数据结构:泛型_泛型_07

这里使用 通配符 就可以传递任何参数。

1.4.1、通配符上界 与 下界

数据结构:泛型_通配符上下界_08

上界:​​<? extends 上界>​​:不能写入数据,只能读取数据

下界:​​<? super 下界>​​:不能读取数据,只能写入数据

1.5、包装类

装箱:

public class TestDemo5 {
public static void main2(String[] args) {
//拆箱:将 Integer 类型放在 基本类型里面
Integer a = 20;
//自动拆箱:
int b = a;
//手动拆箱:
int c = a.intValue();
double d = a.doubleValue();
}

public static void main1(String[] args) {
//装箱:将 i 的值放在 a 中
int i = 10;
//自动装箱:
Integer a = i;
//手动装箱:
Integer b = Integer.valueOf(i);
}
}

数据结构:泛型_包装类_09

上述代码中出现的问题是为什么???

数据结构:泛型_通配符上下界_10