为什么要用泛型?
泛型程序的设计主要是为了编写的代码可以被不同的对象重用。
最简单的例子就是ArrayList。我们不能为每个对象写一个ArrayList,为了适用于所有对象,ArrayList被设计为泛型类。有人说不用泛型,用Object不就可以了?但是用Object,意味着在具体对象面前你又要强制类型转换。
泛型类
泛型类就是又一个或多个类型变量的类。
下面定义一个泛型的坐标类。
public class Point{privateT x;privateT y;publicT getX() {returnx;
}public voidsetX(T x) {this.x =x;
}publicPoint(T x, T y) {this.x =x;this.y =y;
}publicPoint() {
}
}
View Code
这样我们可以传入自己需要的类型,如:
Point point1 = new Point<>(1,1);
Point point2 = new Point<>(1f,1f);
泛型方法
泛型方法是指带有类型参数的方法。
classArrayUtil{public static T getMiddle(T[] array){return array[array.length/2];
}
}
泛型接口
泛型接口和泛型类用法一样,如:
public interface JavaBeanCRUD{
T getObjectById(String id);voidaddObject(T obj);voiddelObjById(String id);voidupdateObj(T obj);
}
public interface StudentDao extends JavaBeanCRUD{
}
public class StudentDaoImpl implementsStudentDao {
@OverridepublicStudent getObjectById(String id) {return null;
}
@Overridepublic voidaddObject(Student obj) {
}
@Overridepublic voiddelObjById(String id) {
}
@Overridepublic voidupdateObj(Student obj) {
}
}
简单的例子我们能看到泛型确实给我们减少了代码的重写。
类型变量的限定
如果我们需要写一个方法,实现获取集合中最大值,即用到compareTo接口。我们可以用extends限制变量的类型。如:
public static T getMax(T[] array){if(array==null || array.length==0)return null;
T max= array[0];for(T temp : array){if(max.compareTo(temp)<0)
max=temp;
}returnmax;
}
extends这里不再是我们熟悉的继承的意思了。这里约束了getMax这个方法传入的对象必须继承Comparable,否则会有编译上的错误。
一个类型变量或通配符可以有多个限定,限定之间用 ‘&’ 分开即可,如:
T extends Comparable & Serializable