Java泛型
什么叫泛型
泛型就是将类型由原来的具体类型参数化,此时类型也定义成参数形式,然后在使用传入具体的类型。
主要目的
Java泛型的主要目的是可以建立具有类型安全的数据结构,如链表、散列表等数据结构,最重要的一个优点就是:在使用这些泛型类建立的数据结构时,不必进行强制类型转换,既不要求进行运行时类型更安全。JDK1.5编译器在泛型使用时,将运行时的类型检查提前到编译时执行,使代码更安全。总而言之,泛型的推出就是为了建立具有类型安全的数据结构。
泛型类声明
可以使用“class 名称<泛型列表>”声明一个类,为了和普通类有所区别,这样声明的类称作泛型类。
class People<E>
People是泛型类的名称,E是其中的泛型,并没有指定E是何种类型的数据,它可以是任何对象或者接口,但不能是基本的数据类型。同时不用字母E也可以,可使用任何一个合法的标识符。泛型声明时,”泛型列表“给出的泛型可以作为类的成员变量的类型、方法的类型以及局部变量的类型。
使用泛型类声明对象
Cone<Circle> coneOne;
coneOne = new Cone<Circle>(new Circle); //泛型类声明对象时必须要用具体的类代替泛型
实例:设计一个锥体,只关心它的底面积是多少,不考虑底的具体形状,只关注底面积和高计算出其体积。因此可以用泛型来作为其底:bottom类型为泛型。
Cone.java
//使用泛型类声明椎体对象
public class Cone<E> {
double height;
E bottom;
public Cone(E b){
//泛型类E声明对象bottom
bottom = b;
}
public void setHeight(double h){
height = h;
}
public double computerVolume(){
//泛型变量只能调用从Object类继承的或重写的方法
String s = bottom.toString();
//执行到这步时会调用具体类中重写的toString方法,泛型不能是基本类型,所以先强制转化为String类型再转化为double类型进行计算
double area = Double.parseDouble(s);
return 1.0/3.0 * area * height;
}
}
Rect.java(底的形状)
public class Rect {
double sideA,sideB,area;
Rect(double a,double b){
this.sideA =a ;
this.sideB = b;
}
public String toString(){
area = sideA*sideB;
return "" + area;
}
}
Circle.java
public class Circle {
double area,radius;
Circle (double r) {
radius = r;
}
//bottom泛型类变量只能调用Object变量,所以Circle和Rect都重写了toString方法
public String toString() {
area = radius * radius * Math.PI;
return "" + area;
}
}
测试类Area
public class Area {
public static void main(String args[]) {
Circle circle = new Circle(10);
//泛型类声明对象,一定要用具体的类替代<>中的泛型
//Cone泛型的名称 <>泛型
Cone<Circle> coneOne = new Cone<Circle>(circle);
coneOne.setHeight(16);
System.out.println(coneOne.computerVolume());
Rect rect = new Rect(15,23);
Cone<Rect> coneTwo = new Cone<Rect>(rect);
coneTwo.setHeight(98);
System.out.println(coneTwo.computerVolume());
}
}
实验结果: