【泛型 Generic】
参数化类型
为什么要使用泛型?
当我想做一个容器类型时,希望可以保存任意类型的数据,
往往会把存放的方法参数设置为Object类
取出方法的返回值也设置为Object类,
但是这样在使用时,无法保证存放和取出的类型是同一种类型
这样的话当我做强制类型转换时,就无法保证程序会正常运行
如果希望存放和取出的是同样的任意类型,
就必须要使用参数化类型来指定参数的类型,
这个技术就叫做泛型
1. 泛型接口
占位符T,可以存放任意类型,传入的是什么类型,方法里面接收到的就是该类型,在编译的时候无法确定是什么类型,但是在运行时决定它的真实类型
2. 泛型类
范例:定义泛型类
子类继承泛型类的写法
形式1:
在子类继续设置泛型
public class RecordDaoImpl<T> extends BaseDaoImpl<T> implements RecordDao {
形式2:
在子类不设置泛型,而在父类明确的定义一个泛型类型
public class RecordDaoImpl extends BaseDaoImpl<Record> implements RecordDao {
3. 泛型方法
泛型方法不一定非要定义在支持泛型的类里面。
能够看懂泛型方法的标记就行了
4. 通配符
? 匹配任意类型和T的区别是:T只能匹配一种类型?一般用于接收
? super A 匹配A的父类包括A(下边界)
? extends A 匹配A的子类包括A(上边界)(用的多)
5. 类型推测(JDK7 新特性)
构造器不指定泛型,但是引用要指定泛型
#6. 类型擦除
泛型技术是JDK5的新特性,并没有为这个技术修改JVM,
仅仅是修改了javac
就导致泛型技术仅仅在编译的一瞬间才生效,运行时没有效果
// 类型擦除时注意的地方
//以下2个方法无法重载,编译不通过,任意一个方法编译之后的泛型就没有了
public static void test(List<String> list) {
}
public static void test(List<Integer> list) {
}
应用:https://blog.csdn.net/qq_36194262/article/details/82735256
【链表】
泛型在实际开发中,往往会用作容器类型的制作
动态数组 ArrayList:可以用数组保存任意多数量的对象
但是动态数组有一个问题,当我们频繁的添加和删除对象时,往往会涉及到某一范围内的元素集体复制等操作
是一个非常效率低下的操作
链表 LinkedList:保存任意多个数量的对象
考虑:链表要如何实现呢?
add() 已完成
size() 已完成
get() 已完成
remove() 已完成
set()