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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1.         public static void printCollection(Collection<?> collection){
  2.                
  3.                 //collection.add();false
  4.                 System.out.println(collection.size());
  5.                
  6.                 for(Object obj : collection){
  7.                         System.out.println(obj);
  8.                 }
  9.         }
  10.        
  11.         public static <T>void printCollection2(Collection<T> collection,T obj2){
  12.                
  13.                 collection.add(obj2);
  14.                 System.out.println(collection.size());
  15.                
  16.                 for(Object obj : collection){
  17.                         System.out.println(obj);
  18.                 }
  19.         }
复制代码
第二种情况为什么能添加元素啊,这个<T>是不是已经确定的泛型类型啊。如果是他是怎么确定的,如果不是,那它不就和<?>一样了么。

评分

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

查看全部评分

3 个回复

倒序浏览
说白了就是写成T就是将类型固定,而?则不固定,比如下面这个例子
public class CollectionGenFoo<T extends Collection> {
...
}

这么写就会报错
CollectionGenFoo<ArrayList> listFoo = new CollectionGenFoo<ArrayList>(new ArrayList());

如果把 CollectionGenFoo<T extends Collection> 改成 CollectionGenFoo<? extends Collection>的话
CollectionGenFoo<Collection> listFoo = new CollectionGenFoo<ArrayList>(new ArrayList());
则不会报错
回复 使用道具 举报
第一种情况不能添加元素是因为类型不确定?代表什么类型都行,本来我这集合里放的是String,如果添加其它元素的话就会有冲突,所以不能添加元素,只能进行查询和判断
第二种情况是根据你自己传的参数确定的,你传的是什么,这个T就是什么
比如:ArrayList<Integer> collection = new ArrayList<Integer>();就是所有的T都为Integer,你就不能在collection里放其他对象了
有一个人打的比喻非常好“T就像斗地主里的癞子”你想让T是什么就是什么
回复 使用道具 举报
          使用<T>来声明类型持有者名称,自定义泛型类时,类持有者名称可以使用T(Type),如果是容器的元素可以使用E(Element),若键值匹配可以用K(Key)和V(Value)等,叫泛型方法;若是<?>,则是默认是允许Object及其下的子类,也就是java的所有对象了,这叫通配符。
          通配符是被设计用来支持灵活的子类化的,泛型方法允许类型形参被用来表示方法的一个或对个参数之间的类型依赖关系,或者方法返回值与参数之间的依赖关系,如果没有这样的类型依赖关系,不应该使用泛型方法。
       注:
         如果某个方法中的一个形参(a)的类型或者返回值的类型依赖于另一个形参(b)的类型,则形参(b)的类型声明不应该使用通配符——因为形参(a)或返回值的类型依赖于该形参(b)的类型,如果形参(b)的类型无法确定,程序无法定义形参(a)的类型,在这种情况下,只能考虑使用在方法签名中声明类型形参。

          类型通配符<?>和显式声明类型形参<T>还有一个重要区别:类型通配符既可以在方法签名中定义形参的类型,也可以用于定义变量的类型。
                                                                                           但泛型方法中类型形参必须在对方方法中显式声明。
         
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马