1.泛型前言
泛型的本质是参数化类型,
参数化类型:所操作的数据类型被指定为一个参数,将类型由原来的具体的类型参数化
//泛型中:T\E\K\V
import java.util.Arrays;
//可存在多个泛型类型<T,E,..>
public class MyArrayList<T> {
private T[] element;
private int size;
public MyArrayList(){
this(10);//this(); 只能在构造函数之间调用 (位于当前有效代码第一行)
}
public MyArrayList(int num){
element = (T[])new Object[num];
}
/*
行为
*/
public void addTail(T value){
if(size == element.length){
element = Arrays.copyOf(element,element.length*2);
}
element[size++] = value;
}
public void show(){
for (int i = 0; i < size; i++) {
System.out.print(element[i]);
}
}
}
public class TestDemo {
public static void main(String[] args) {
MyArrayList<String> myString = new MyArrayList<>();
myString.addTail("String");
MyArrayList<Integer> my = new MyArrayList<>();
my.addTail(10);
my.addTail(20);//1.任何引用类型都可以操作MyArrayList 2.通过泛型参数保证了所操作的数据类型相同
//MyArrayList my = new MyArrayList();
//MyArrayList<Object> my = new MyArrayList<>();
}
}
1、泛型类: class 类名<泛型参数>{ }
2、泛型参数只作用于编译期间,运行->类型擦除(T变成Object)
- 类型安全检测
- 类型推导
3、泛型注意点: - 泛型参数只能是引用数据类型,不能是基本数据类型
- 不能直接new泛型数组
- 不能直接new泛型对象 new T()
- 对类型进行自动检查
- 自动对类型类型推导
2.泛型接口
使用:
3.泛型方法
返回值前面加上泛型参数
例:swap()
针对任何数据类型都可以交换
冒泡排序泛型实现:
冒泡放在ArrayList中(类型擦除Object
)
import java.util.Arrays;
//可存在多个泛型类型<T,E,..>
public class MyArrayList<T extends Comparable<T>> {
private T[] element;
private int size;
public MyArrayList(){
this(10);//this(); 只能在构造函数之间调用 (位于当前有效代码第一行)
}
public MyArrayList(int num){
element = (T[])new Comparable[num];
}
/*
行为
*/
public void addTail(T value){
if(size == element.length){
element = Arrays.copyOf(element,element.length*2);
}
element[size++] = value;
}
public void bubbleSort(){
for(int i = 0;i<element.length;i++){
for (int j = 0; j < element.length-1-i; j++) {
if(element[j].compareTo(element[j+1])>0){
TestDemo.swap(element,j,j+1);
}
}
}
}
extends主要限定泛型参数的上界(常见如下):
- <T extends 基类>://只能是基类或者基类的派生类
- <T extends 基接口>//只能是实现基接口的派生类
今天也要好好学习呀~