A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM李超 高级黑马   /  2013-3-9 01:04  /  3276 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大多数时候可以使用泛型方法来代替类型通配符,例如JDK的Collection中两个方法的定义:
  1. public interface Collection<E>
  2. {
  3.         boolean containsAll(Collection<?> c);
  4.         boolean addAll(Collection<? extends E> c);
  5. }
复制代码
上面的集合两个方法的形参都采用了类型通配符的形式,也可以采用泛型方法的形式代替它,如下:
  1. public interface Collection<E>
  2. {
  3.         boolean <T> containsAll(Collection<T> c);
  4.         boolean <T extends E> addAll(Collection<T> c);
  5. }
复制代码
问题:那么这两种形参定义方式有什么区别呢?
          我们在开发时,在什么情况下使用类型通配符形式,在什么情况下该使用泛型方法的形式呢?

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

4 个回复

倒序浏览
应用开发中泛形的确应用很少,除非做一些平台开发,多看看一些源码就知道了,留着疑惑,慢慢来。

这问题我答了。。。
回复 使用道具 举报
就我感觉而言  通配符就是对泛型类型的一种扩展   当你不知道用什么类型时  用?  或者  类型限定是 用 ?  extends  E  更直观一下  

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
admin 发表于 2013-3-9 01:11
应用开发中泛形的确应用很少,除非做一些平台开发,多看看一些源码就知道了,留着疑惑,慢慢来。

这问题我 ...

这是我见过加技术分最多的一个帖子了,得好好看看
回复 使用道具 举报
在这两个方法中,类型形参T只使用了一次,类型形参T的唯一效果是可以在不同的调用点传入不同的实际类型.对于这种情况,应该使用通配符.

泛型方法允许类型形参被用来表示方法的一个或多个参数之间的类型类型依赖关系,或者方法返回值与参数之间的类型依赖关系.如果没有这样的类型依赖关系,不应该使用泛型方法.

如果需要,也可以同时使用泛型方法和通配符.例如Collections 类中的copy()方法:

class Collections{

public static<T>void copy(List<T>d,LIst<?Extends T>s){

//代码实现

}

}

在 copy()方法中,两个参数之间存在明显的依赖关系,即从源程序中赋值出来的元素,必须要复制到目标程序中,所以集合元素的类型只能是目标集合元素的类型本身或是其子类的类型.但是在JDK中表示源程序的S形参使用的是通配符,而不是泛型方法,是因为该方法无需向源程序集合中添加元素,也无需改变源程序集合里的元素,所以可以使用类型通配符,无需使用泛型方法.

对于上面的代码,也可以采用泛型方法,而不使用通配符,修改后代码如下:

class Collections{

public static<T>void copy(List<T>d,LIst<S>s){

//代码实现

}

}

这上方法签名可以代替前面的方法签名,但需要注意上面的类型形参S,它也是仅用了一次,没有其它参数类型,方法返回值类型依赖于它,那类型形参S就没有必要存在.即可以用通配符来代替S
使用通配符比显示声明类型形参更加清晰准确,所以在可能的情况下使用通配符更好.

类型通配符与显示志明类型形参还有一个显著的区别:

类型通配符即可以方法签名中定义形参的类型,也可以于定义变量的类型,但泛型方法中类型形参必须在对应方法中显示声明

评分

参与人数 1技术分 +1 收起 理由
admin + 1 好吧,先加再看

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马