泛型定义
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。
泛型规则限制
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型;
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的;
3、泛型的类型参数可以有多个;
4、泛型的参数类型可以使用extends、super语句,例如。习惯上称为“有界类型“;
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName("java.lang.String");
示例对比
有这样一个需求:定义矩形对象,使矩形对象的宽度、高度既可以支持整形又可以支持字符串类型(例子可能不太恰当~~)。在不使用泛型的情况下,我们可能会定义两个类,一个类支持整形参数,另一个类支持字符串类型参数,如下:
类一:
package com.ips.volatiles.demo1;
public class RectangleInteger {
private Integer width;
private Integer height;
public RectangleInteger(Integer width, Integer height){
this.width = width;
this.height = height;
}
public Integer getWidth() {
return width;
}
public void setWidth(Integer width) {
this.width = width;
}
public Integer getHeight() {
return height;
}
public void setHeight(Integer height) {
this.height = height;
}
public void showDetails(){
System.out.println("the rectangle, width is " + this.width + " height is " + this.height);
}
public static void main(String [] args){
Integer width = 10;
Integer height = 5;
RectangleInteger rect = new RectangleInteger(width, height);
width = rect.getWidth();
height = rect.getHeight();
rect.showDetails();
}
}
类二:
package com.ips.volatiles.demo1;
public class RectangleString {
private String width;
private String height;
public RectangleString(String width, String height){
this.width = width;
this.height = height;
}
public String getWidth() {
return width;
}
public void setWidth(String width) {
this.width = width;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
public void showDetails(){
System.out.println("the rectangle, width is " + this.width + " height is " + this.height);
}
public static void main(String [] args){
String width = "20";
String height = "40";
RectangleString rect = new RectangleString(width, height);
width = rect.getWidth();
height = rect.getHeight();
rect.showDetails();
}
}
类三(泛型方式定义):
package com.ips.volatiles.demo1;
public class Rectangle<T> {
private T width;
private T height;
public Rectangle(T width, T height){
this.width = width;
this.height = height;
}
public T getWidth() {
return width;
}
public void setWidth(T width) {
this.width = width;
}
public T getHeight() {
return height;
}
public void setHeight(T height) {
this.height = height;
}
public void showDetails(){
System.out.println("the rectangle, width is " + this.width + " height is " + this.height);
}
public static void main(String [] args){
Integer width = 10;
Integer height = 5;
Rectangle<Integer> rect = new Rectangle<Integer>(width, height);
width = rect.getWidth();
height = rect.getHeight();
rect.showDetails();
String widthStr = "20";
String heightStr = "40";
Rectangle<String> rect1 = new Rectangle<String>(widthStr, heightStr);
widthStr = rect1.getWidth();
heightStr = rect1.getHeight();
rect1.showDetails();
}
}
作用
再次强调一下泛型的作用:泛型的好处是在编译的时候进行类型安全检查,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。