Java泛型一:泛型定义及规则

来源:互联网 发布:怎么在淘宝卖耐克正品 编辑:程序博客网 时间:2024/05/23 01:03

泛型定义

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

作用

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

1 0