泛型定义

泛型是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();
    }
}

作用

再次强调一下泛型的作用:泛型的好处是在编译的时候进行类型安全检查,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。