Java 的泛型程序设计( Generic Programing)

    技术2026-05-14  12

    1、泛型类

    ArrayList 类可以接受任何类型的参数,所以,取出来的类型肯定就是 Object 类型,这给我们使用带来了不便,因为取出来的都是 Object 对象,当我们想要恢复传入时候的数据类型,我们就必须进行强制类型转换:

    1: public static void main(String[] args) { 2: ArrayList al = new ArrayList(); 3: al.add("String"); 4: String str = (String)al.get(0); 5: } 泛型的引入,限制的转入参数的数据类型,解决了上述强制类型转换的麻烦: 1: public static void main(String[] args) { 2: ArrayList al = new ArrayList (); 3: al.add("String"); 4: String str = al.get(0); 5: } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }注意泛型里构造函数的括号依旧在最右边。

    值得注意的是,ArrayList 类是 JDK 类库提供的类,然而当我们自己需要编写像 ArrayList 类这样的支持泛型的类,我们该怎么办呢?我们可以参照下面的代码实现:

    1: class Pair { 2: 3: private T a; 4: private T b; 5: 6: public Pair(T a, T b) { 7: super(); 8: this.a = a; 9: this.b = b; 10: } 11:   12: public T getA() { 13: return a; 14: } 15:   16: public void setA(T a) { 17: this.a = a; 18: } 19:   20: public T getB() { 21: return b; 22: } 23:   24: public void setB(T b) { 25: this.b = b; 26: } 27: 28: } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }这里定义的 Pair 就是泛型类,使用方法与 ArrayList 类相同。上面中的 T 是类型变量,Java 中的类型变量用 E 表示集合的元素类型,K 和 V 关键字与值的类型, T 表示任意类型(必要时候还可以使用 U、S 来表示任意类型)。

    2、泛型方法

    泛型方法可以定义在普通类中(当然也可以在泛型类中),示例如下:

    1: class Tools{ 2: 3: public static T getMiddle(T[] a){ 4: return a[a.length/2]; 5: } 6: 7: } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }注意到类型变量放在了返回类型的前面。
    最新回复(0)