Java的泛型-笔记

来源:互联网 发布:淘宝 零食 知乎 编辑:程序博客网 时间:2024/05/22 14:29

Java的泛型

本文参考《Java in a Nutshell, 6th edition》英文版

The syntax <T> has a special name—it’s called a type parameter, and another name for a generic type is a parameterized type. This should convey the sense that the container type (e.g., List) is parameterized by another type (the payload type).

下面两个例子实现同样的功能:

  • 使用泛型
/** * 泛型Generics *//*有两个类如下,要构造两个类的对象,并打印出各自的成员。下面的实现就比较无聊:public class StringFoo {    private String x;    public StringFoo(String x) {        this.x = x;    }    public void setX(String x) {        this.x = x;    }    public String getX() {        return x;    }}public class DoubleFoo {    private Double x;    public DoubleFoo(Double x) {        this.x = x;    }    public void setX(Double x) {        this.x = x;    }    public Double getX() {        return x;    }}*/class Gen<T> {    private T obj; // 定义泛型成员变量    // 构造    public Gen(T ob) {        this.obj = ob;    }    public void setObj(T ob) {        this.obj = ob;    }    public T getObj() {        return obj;    }    public void showType() {        System.out.println("T当前实际类型:" + obj.getClass().getName());    }}public class HelloJava {    public static void main(String[] args) {        // 定义泛型类Gen的一个Integer版本        Gen<Integer> integerObj = new Gen<Integer>(100);        integerObj.showType();        Integer i = integerObj.getObj();        System.out.println("value=" + i);        System.out.println("------------------");        // 定义泛型类Gen的一个String版本        Gen<String> strObj = new Gen<String>("Hi,java!");        strObj.showType();        String s = strObj.getObj();        System.out.println("value=" + s);    }}// 运行结果:T当前实际类型:java.lang.Integervalue=100------------------T当前实际类型:java.lang.Stringvalue=Hi,java!
  • 不使用泛型
/** * 普通类,不使用泛型 */class Gen2 {    private Object obj; // 定义一个通用类型成员    public Gen2(Object ob) {        this.obj = ob;    }    public void setObj(Object ob) {        this.obj = ob;    }    public Object getObj() {        return obj;    }    public void showTyep() {        System.out.println("T当前实际类型:" + obj.getClass().getName());    }}public class HelloJava {    public static void main(String[] args) {        // 定义类Gen2的一个Integer版本        Gen2 intOb = new Gen2(new Integer(100));        intOb.showTyep();        Integer i = (Integer) intOb.getObj();        System.out.println("value=" + i);        System.out.println("------------------");        // 定义类Gen2的一个String版本        Gen2 strOb = new Gen2(new String("Hi,java!")); // 或 Gen2 strOb = new Gen2("Hi,java!");        strOb.showTyep();        String s = (String) strOb.getObj();        System.out.println("value=" + s);    }}// 运行结果:T当前实际类型:java.lang.Integervalue=100------------------T当前实际类型:java.lang.Stringvalue=Hi,java!

0 0