目录
一、什么是泛型
泛型是在JDK1.5引入的新的语法,通俗讲,泛型就是适用于许多许多类型。从代码上讲,泛型就是对类型实现了参数化。
二、引出泛型
我们不妨设想一下,是否存在这样一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值? 通过我们以前学过的数组的有关知识,我们知道:数组只能存放指定类型的元素。但我们又知道所有类的父类,默认为Object类。那么数组是否可以创建为Object?我们可以编写以下代码:
public class Main {
public static void main1(String[] args) {
MyArray myarray=new MyArray();
myarray.setVal(0,13);
myarray.setVal(1,"hello");
String str=myarray.getPos(1);//编译报错
System.out.println(str);
}
}
通过上述代码,我们可以知道:该方法可以存放任意数据类型,但同时我们也发现1下标是字符串,但用String接收时会报错。我们进行如下改动后发现:可以将1下标进行强制类型转换来解决报错问题。
public class Main {
public static void main(String[] args) {
MyArray myarray=new MyArray();
myarray.setVal(0,13);
myarray.setVal(1,"hello");
String str=(String)myarray.getPos(1);
System.out.println(str);
}
}
结果如下:
虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望它只能够持有一种数据类型。而不是同时持有多种类型。所以,泛型的主要目的就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。
三、泛型的语法
class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
或
class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}
注意:类名后的代表占位符,表示当前类是一个泛型类
四、泛型类的使用
泛型类<类型实参> 变量名=new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象
例如:
Alg<Student> alg=new Alg<Student>();
注意:泛型只能接受类,所有的基本数据类型必须使用包装类!(上述类型实参之所以省略,是因为当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写 )
五、泛型的上界
在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。
5.1、语法
class 泛型类名称<类型形参 extends 类型边界>{
......
}
5.2、示例
public class MyArray<E extends Number>{
.......
}
只接受 Number 的子类型作为 E 的类型实参 。
六、泛型方法
6.1、语法
方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }
6.2、示例(交换数组中两元素的值)
public class Utit{
public static <E>void swap(E[] array,int i,int j){
E t=array[i];
array[i]=array[j];
array[j]=t;
}
}
本篇完.......