泛型也可以用于接口,例如生成器,这是一种专门负责创意对象的类。实际上是工厂方法设计模式的一种应用。不同的是它不需要任何参数。

 

一般一个生成器只定义一个方法,该方法用于产生新的 对象。

 

例子:

 

public interface Generator<T> { T next(); } 

 

辅助类:

 

public class Coffee {
  private static long counter = 0;
  private final long id = counter++;
  public String toString() {
    return getClass().getSimpleName() + " " + id;
  }
}

public class Latte extends Coffee {} 

public class Mocha extends Coffee {} 

public class Americano extends Coffee {}

 

 实现Generator<Coffer>接口,它能够随机生产不同类型的Offee对象

 

 

public class CoffeeGenerator
implements Generator<Coffee>, Iterable<Coffee> {
  private Class[] types = { Latte.class, Mocha.class,
    Cappuccino.class, Americano.class, Breve.class, };
  private static Random rand = new Random(47);
  public CoffeeGenerator() {}
  // For iteration:
  private int size = 0;
  public CoffeeGenerator(int sz) { size = sz; }	
  public Coffee next() {
    try {
      return (Coffee)
        types[rand.nextInt(types.length)].newInstance();
      // Report programmer errors at run time:
    } catch(Exception e) {
      throw new RuntimeException(e);
    }
  }
  class CoffeeIterator implements Iterator<Coffee> {
    int count = size;
    public boolean hasNext() { return count > 0; }
    public Coffee next() {
      count--;
      return CoffeeGenerator.this.next();
    }
    public void remove() { // Not implemented
      throw new UnsupportedOperationException();
    }
  };	
  public Iterator<Coffee> iterator() {
    return new CoffeeIterator();
  }
  public static void main(String[] args) {
    CoffeeGenerator gen = new CoffeeGenerator();
    for(int i = 0; i < 5; i++)
      System.out.println(gen.next());
    for(Coffee c : new CoffeeGenerator(5))
      System.out.println(c);
  }
} 

 

 

参数化的Generator接口确保next()方法的返回值是参数的类型,