疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

泛型的应用_Java培训


 

       泛型程序设计(Generic programming)意味着编写的代码能可以被很多不同类型的对象所重用,例如,我们不希望为了聚集String和File对象来分别设计不同的类。

  在Java SE 5.0之前,Java泛型程序设计使用继承实现的,当时的ArrayList类只维护一个Object引用的数组。这样就导致了没有错误检查,可以向数组列表添加任何类对象。泛型提供了一个更好的解决方案:类型参数(type parameters)。新的ArrayList类有一个类型参数用来指示元素的类型:ArrayList files = new ArrayList();这样,编译器就可以进行检查,避免插入错误类型的对象,在调用ArrayList的get方法返回对象的时候,也不需要像以前一样需要强制转化为String了。

  一个泛型类(generic class)就是具有一个或多个类型变量的类。如:

  public class Person {

  private T first;

  public T getFirst() {

  returnfirst;

  }

  publicvoid setFirst(T first) {

  this.first = first;

  }

  }

  注意,泛型类可以有多个泛型变量,类型变量使用大写形式(也可以使用小写),且比较短(可以多个字母,甚至字母加数字)。在Java库中,使用变量E表示结合的元素类型,K和V分别表示表的关键字和值的类型。T(需要时还可以用临近的字母U和S)表示“任意类型”。

  当然,我们也可以在普通类里面定义一个泛型方法,例如:

  public class GetManager {

  publicstatic T getMiddle(T[] a) {

  return a[a.length / 2];

  }

  public T dealOpera(T t1, T t2, T t3) {

  return t3;

  }

  }

  注意,类型变量放在修饰符(这里是public static和public)的后面,返回类型的前面。泛型方法可以定义在普通类中,也可以定义在泛型类中。例如,我们可以在Person类中加入一个方法:

  // 此时类型变量不能用T,这和Person冲突了,所以用了其他字母比如U

  public static U getLast(U[] a) {

  return a[a.length - 1];

  }

  当调用一个泛型方法时,在方法名前的尖括号中放入具体的类型:

  String[] names = {"John", "Zhizhen", "Jack"};

  String middle = GetManager. getMiddle(names);

  大多数情况下,方法调用可以省略类型参数(这里是),编译器有足够信息推断出所调用的方法。也就是说可以这样调用:

  String middle = GetManager.getMiddle(names);

  有人会问,为什么不将类型参数放在方法名后面呢?怕导致语法分析歧义,如g(f(c))可以理解为“用f的结果调用g”,或者理解为“用两个布尔值f(c)调用g”。