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

来源:互联网 发布:西安财经行知学院学费 编辑:程序博客网 时间:2024/06/06 02:34

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; }注意到类型变量放在了返回类型的前面。
原创粉丝点击