泛型
泛型是通用类型的类,泛型类对象可以表示多种不同种类的类的对象。类是对属性和行为的封装。采用泛型类,将封装方式相同但属性类型不同的多个类用一个泛型类表示。
泛型类:
class 泛型类名 <类型参数列表>{
// body
}
class MyArrayList<T>{
private T[]element =(T[])new Object[10];
}
定义泛型类后就可以定义泛型类的对象。定义形式
泛型类名[<实际类型列表>] 对象名 = new 泛型类名 [<实际参数列表>] ([形参表]);或
泛型类名[<实际类型列表>] 对象名 = new 泛型类名 [<>] ([形参表]);
MyArrayList<String> my1 = new MyArrayList<>();
泛型参数T 作用于编译期:类型推导、类型安全检测
运行期:类型擦除 ->运行期变成了object类型
泛型接口:
泛型接口的定义形式是:
interface 接口名{
// body
}
在实现接口时,也应该声明与接口相同的类型参数 T
class 类名 implements 接口名{
// body
}
泛型方法:
与当前类是否是泛型无关,在定义方法时声明了类型参数,只限于在该方法中使用。泛型方法既可以定义在泛型类中,也可以定义在非泛型类中。
在返回值前面加
public class test{
public static <T>void swap (T[] arr,int index1,int index2){
T temp =arr[index1];
}
}
若要将类定义成泛型,则需要先生成对象,才能知道 T 的类型,进而进行调用,而static关键字与方法无关,则需要在static后加上 , 定义为静态方法。
类型擦除
类型限定:
extends主要限定泛型参数的上界
<T extends 基类> :T 只能是基类或基类的派生类
<T extends 基接口>:T只能是实现基接口的派生类
<类型参数 extends comparable <类型参数>>
泛型参数:不满足 向上造型
错误:MyArrayList my = new MyArrayList();
正确:MyArrayList<?> my = new MyArrayList();
泛型注意点:
1.泛型参数 必须为引用数据类型或基本数据类型的包装类(eg: integer)
2.不能new 泛型数组
错误:element = new T[number];
正确: element = (T[]) new Object[number];
MyArrayList =(T[])new Object[number];
- 不能new 泛型对象 new T(); (因为在堆上开辟内存,无法知道对象类型,所以无法开辟)
通配符
由 " ?"表示,它代表一个未知类型。