JDK 1.5之Generics

  Generics 是JDK 1.5 一个最重要的特性,主要用来处理Collection。

  以下代码在JDK 1.5 调试通过。

  代码实例1: Demo.java

  package maoxiang.examples.jdk15.generics;

  import java.util.ArrayList;

  import java.util.Collection;

  import java.util.HashMap;

  import java.util.LinkedList;

  import java.util.List;

  import java.util.Map;

  /**

  * @author 毛翔

  *

  * 演示如何使用Generics 特性。代码来自于 Generics 教程:

  * http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

  *

  * Generics类似于C++中的模板。

  * 区别:

  * 1.

  * 2.

  */

  public class Demo {

  public static void main(String[] args) {}

  /**

  * 最简单的用法

  */

  public void Test1() {

  // 以前的用法

  //List myIntList = new LinkedList(); // 1

  //myIntList.add(new Integer(0)); // 2

  //Integer x = (Integer) myIntList.iterator().next(); // 3 需要强制转换

  // 1.5 的用法

  List myIntList = new LinkedList(); // 1'

  myIntList.add(new Integer(0)); //2'

  Integer x = myIntList.iterator().next(); // 3'

  }

  /**

  * 匿名字符的用法

  */

  public void Test2() {

  List list = new ArrayList();

  //通过匿名字符打印一个集合

  Wildcards(list);

  Wildcards1();

  /*

  * 如果 Wildcards2 定义为Wildcards2(List shapes)

  * 以下调用错误

  */

  Wildcards2(list);

  }

  public void Wildcards(Collection< ? > c) {

  // 以前的用法

  //Iterator i = c.iterator();

  //for (int k = 0; k < c.size(); k++) {

  //

  log(i.next());

   //}

  //1.5 的用法

  //Collection c 表示

  for (Object e : c) {

  log(e);

  }

  }

  public void Wildcards1() {

  //Collection c = new ArrayList();

  //c.add(new Object()); // compile time error

  //以上为错误的用法,因为不能确定 c 的类型 ,不能使用add ,但get可以 。正确的用法如下:

  ArrayList c = new ArrayList();

  c.add("test");

  List< ? > list = c;

  log(c.get(0));

  }

  public void Wildcards2(List< ? extends Shape> shapes) {

  //List shapes 定义只能接受List shapes,也不能接受 List

  for (Shape s : shapes) {

  s.draw();

  }

  //以下写法错误,因为为参数申明为 extends Shpape,无法确定Rectangle 为Shape子类,属于不安全调用

  //shapes.add(0, new Rectangle());

  Map allDrivers = new HashMap();

  Census.addRegistry(allDrivers);

  //以下写法允许,因为drivers明确定义,

  List drivers = new ArrayList();

  Census.add(drivers);

  }

  /**

  * Generic Methods 的用法

  *

  */

  public void Test3() {

  //适用于各种类型的函数

  Object[] oa = new Object[100];

  Collection