第二十七条:优先考虑泛型方法

就如类可以从泛型中受益一般,方法也可以。静态工具方法尤其适合与泛型化。JDK中的Collections泛型中的

所有“算法”方法都泛型化了。

如:下面这个方法返回连个集合的联合。

public static  Set  union(Set  s1,Set  s2)

{

     Set  result  = new  HashSet(s1);

     result.addAll(s2);

     return  result;

}

为了方法变成类型安全的,要将方法声明修改为声明一个类型参数。表示这三个集合的元素类型(两个参数和一个返回值),并在方法中

使用类型参数。声明类型参数的类型参数列表,处在方法的修饰符及其返回类型之间。在这个示例中,类型参数列表为<E>,返回类型为

Set<E>。类型参数的命名习惯与泛型方法以及泛型的相同,一般是E或者T。

改写为泛型方法如下:

public  static  <E>   Set<E>   union(Set<E>  s1,Set<E>  s2)

{

     Set<E>  result  = new  HashSet<E>(s1);

     result.addAll(s2);

     return  result;

}

上面这个union方法的局限性在于,三个集合的类型(两个输入参数和一个返回值)必须全部相同。利用有限制的通配符类型,可以使这个方法更加灵活。

这个参加28条,这里不深入。

 

泛型方法还有一个比较重要的概念叫做类型推导。

我们在创建一个泛型集合实例时,这样写    Map<String , Integer>   map  =  new  HashMap<String , Integer>();

我们在调用泛型HashMap的构造器时,在new HashMap之后使用<String , Integer>指明了类型参数。那么我们在使用泛型方法的时候是否也需要这样做呢?

写出这样的代码 :Set.union<String>(s1,s2);   也就是说是否在需要调用方法的时候像调用构造器的那样在方法名后面指明类型参数。

答案是不需要  。   泛型方法会根据你具体传入的s1,s2的类型,来推断出类型参数E。如果你传入的s1,s2是HashSet<String>,那么类型参数E就是String;

如果你传入的s1,s2是HashSet<Integer>,那么类型参数E就是Integer。  一句话就是:泛型方法的类型参数根据传入的实际参数的类型而定,不需要再调用

时显示指明。

 

在JDK1.7之前,调用泛型的构造器需要在后面指明类型参数,但在JDK1.7中引入了菱形语法,只需要<>,不需要写类型参数。

posted @ 2015-05-05 15:36  wangliyue  阅读(463)  评论(0编辑  收藏  举报