1,泛型的定义:
泛型(宽泛的数据类型)是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候在指定具体的类型。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。
2,泛型的优点:
Java引入泛型是一个较大的功能增强,①类型安全:主要目标是提高 Java 程序的类型安全,通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设,将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。②消除强制类型转换:泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。 经常见到的异常(运行时产生ClassCastException)
3,泛型的缺点:声明泛型变量相应的罗嗦,(很多都是一劳永逸,无伤大雅)
4,泛型类
要求:
可以接受不同数据类型,除了借助方法重载,还可以借助自动装箱和向上转型。我们知道,基本数据类型可以自动装箱,被转换成对应的包装类;Object 是所有类的祖先类,任何一个类的实例都可以向上转型为 Object 类型,例如:
- int --> Integer --> Object
- double -->Double --> Object
- String --> Object
定义一个泛型类:
public class Model<T1,T2> {
private T1 X;
private T2 Y;
public T1 getX() {
return X;
}
public T2 getY() {
return Y;
}
public void setX(T1 x) {
X = x;
}
public void setY(T2 y) {
Y = y;
}
}
调用泛型:
public class Demo {
public static void main(String[] args) {
Model<String,Integer> model = newModel<String,Integer>();
model.setX("字符串");
model.setY(1);
String x =model.getX();
int y =model.getY();
}
}
注意:
#泛型是 Java 1.5 的新增特性,它以C++模板为参照,本质是参数化类型(Parameterized Type)的应用。
#类型参数只能用来表示引用类型,不能用来表示基本类型,如 int、double、char 等。但是传递基本类型不会报错,因为它们会自动装箱成对应的包装类。
5,泛型方法
public class Demo<T1,T2> {
T1 X;
T2 Y;
public T1 getX() {
return X;
}
public T2 getY() {
return Y;
}
public void setX(T1 x) {
X = x;
}
public void setY(T2 y) {
Y = y;
}
//定义一个泛型方法,注意:V1,V2与T1,T2没有任何必然的关系,都是相对独立的,但是<V1,V2>与(V1 x,V2 y)必须一一对应
public static <V1,V2> void printDemo(V1 x,V2 y){
System.out.println("X="+x+" Y=" + y);
}
}
调用:
public static void main(String[] args) {
Demo.printDemo("a", 1);
}
结果:X=a Y=1
6,泛型接口(引用案例)
- public class Demo {
- public static void main(String arsg[]) {
- Info<String> obj = new InfoImp<String>("www.weixueyuan.net");
- System.out.println("Length Of String: " + obj.getVar().length());
- }
- }
- //定义泛型接口
- interface Info<T> {
- public T getVar();
- }
- //实现接口
- class InfoImp<T> implements Info<T> {
- private T var;
- // 定义泛型构造方法
- public InfoImp(T var) {
- this.setVar(var);
- }
- public void setVar(T var) {
- this.var = var;
- }
- public T getVar() {
- return this.var;
- }
- }
附加:
通过 extends 关键字可以限制泛型的类型,
例如,<T extends Number> 表示 T 只接受 Number 及其子类,传入其他类型的数据会报错。
这里的限定使用关键字 extends,后面可以是类也可以是接口。
但这里的 extends 已经不是继承的含义了,应该理解为 T 是继承自 Number 类的类型,或者 T 是实现了 XX 接口的类型。