Java —— 初始泛型
每博一文案
人生就像一趟永不停歇的列车,在岁月长河中不断穿行。
小时候总希望自己快点长大,觉得成年人的世界会很幸福,可当我们长大
后,才发现没有什么是一成不变的。不飞,人也飞,我们走着走着,明白了
没有谁会停留在原地,一直如初,也许,一不小心就会弄丢了对方。
就像席慕容在小红门中写道,这个世界上有很多人,你以为明天一定可以见面,
所以你暂时放下手,但求那么一次,你一转身,有些人就此和你有绝了。
人生路上有些人,注定只能陪我们一程,不管我们是否愿意,转身的刹那,很有可能
就是后悔无期。
———————— 一禅心灵庙语
泛型
数组有一个非常经典的特点,即数组声明后只能存放同一种类型的数据。集合存放元素多元化。可以存放不同的类型的数据,因为集合底层每个元素都会向上转型为 Odject 类型,Odject 类是所有类的父类,任意的类型都可以存入到集合中,集合在设计之初并不确定实际要存储什么类型的对象,所以底层元素了类型设计为Odject 类,集合中可以存入多种数据类型的元素,只有当需要存储相同类型的个体时才会选择使用集合,所以在JDK1.5 以后,使用泛型来解决限制。通过使用泛型,去除了元素类型存入的不确定性,在创建集合之初就约定了这个集合可以存放类型。
泛型类的定义
- 尖括号< > 是泛型的标志,<E> 是类型变量(Type Variable), 变量名一般要大写,E 在定义时是形参,代表的意思是 ,最终传入的类型
- 泛型的分类
- 泛型类
- 泛型方法
泛型
<T> :只是一个占位符,表示当前类是一个泛型类
- 泛型可以自动进行类型的检查,
- 泛型可以进行类型的转换
泛型的坑
- new 泛型类型的数组。 this.elem = new new[10]
- 基本数据类型不可以作为泛型的参数使用,需要使用对应的包装类 MyArrayList myArrayList = new MyArrayList<>();
- 泛型类型参数,不参与类型的组成
package Blog1;
// 泛型
import java.util.Arrays;
// 创建一个泛型类
class MyArrayList<T>{
public T[] elem; // 创建一个泛型数组
public int usedSize;
public MyArrayList() { // 构造方法
// this.elem = new new[10]; // 泛型不可实例化
this.elem = (T[])new Object[10]; // Object父类数组 通过强转置为 泛型数组
}
public void add(T val) { // 泛型参数
this.elem[this.usedSize] = val;
this.usedSize++;
}
public T[] getElem() {
return elem;
}
public T getVal(int n) { // 根据下标返回对应数组的下标值
return elem[n];
}
}
public class Blog16 {
public static void main(String[] args) {
// MyArrayList<int> myArrayList = new MyArrayList<>();
// 基本数据类型不可以作为泛型的参数使用,需要使用对应的包装类才行
MyArrayList<Integer> myArrayList = new MyArrayList<Integer>(); // 等号右边的参数可以省略不写的
myArrayList.add(1);
// myArrayList.add("hello"); 泛型会自动检查类型的一致性
myArrayList.add(2);
myArrayList.add(3);
System.out.println(myArrayList.getVal(1)); // 取对应下标的值
System.out.println(Arrays.toString(myArrayList.getElem())); // 打印泛型数组
}
}
通过以上代码,我们可以看到泛型类的一个使用方法,只需要在所存类型后边跟上 尖括号<> ,并且尖括号内是真正的类型,即 T 可以看作是最后的类型。
面试问题
泛型到底是怎么编译的
面试官想知道的就是4个字 擦除机制
泛型只是编译时期的一种机制 ,异常也是 —— 擦除机制
擦除机制 : 在运行的时候,不存在泛型的说法,所有的处理均在编译阶段已经处理。擦除机制,在编译的时候,泛型类型被擦除为了 Object 使用,注意 不是替换,而是擦除
泛型总结
- 泛型是为了解决某些容器,算法等代码的通用性而引入,并且能在编译间做类型检查
- 泛型利用的是Object 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作
- 泛型是一种编译期间的机制,即MyArrayList<Person>、MyArrayList<String> 在运行期间是一个类型
- 泛型是 Java中的一种合法语法标志就是 尖括号< >
最后:
限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见!