黑马程序员技术交流社区

标题: 泛型<?>的疑惑求解答。 [打印本页]

作者: itheima01    时间: 2013-4-27 22:26
标题: 泛型<?>的疑惑求解答。
本帖最后由 itheima01 于 2013-4-30 19:45 编辑

T E 我知道参数,在主函数中必须给它们隐示赋值,<?>  这个一般用在集合后面如 Collection<?>  在主函数中也能使用<? extends T><? super T> 这俩我明白,但是这个单独的<?>表示什么意思。 Collection <?> c=new ArrayList<?>();   Collection <String> c=new ArrayList<String> 有什么区别。 我知道第二个只能放String类型的对象。前面那个不知道。求大神给个让小弟理解的介绍。谢谢。,

作者: $love    时间: 2013-4-27 23:02
?是代表可以在集合中存放任意数据类型?
作者: 肖宇宥    时间: 2013-4-27 23:16
?代表匹配任何类型
作者: itheima01    时间: 2013-4-28 00:02
c.add("5"); c.add(5); 编译失败。
作者: 谭威    时间: 2013-4-28 00:12
?和T还是有区别的,T代表任意类型,?也代表任意未知类型,多了个未知,意思就是不能够用?来声明对象
比如 private static void iteratotCollection(Collection<?> coll) {
                Iterator<?> it=coll.iterator();
                while(it.hasNext()){
                        ? obj= it.next();//这里是编译不通过的。不能用?来声明obj
                        System.out.println(it.next());
                }
        }
上面代码如果用泛型方法T来表示
private static <T> void iteratotCollection(Collection<T> coll) {
                Iterator<?> it=coll.iterator();
                while(it.hasNext()){
                         T obj=it.next();这是可以的
                        System.out.println(it.next());
                }
        }

作者: 郑雪    时间: 2013-4-28 08:49
谭威 发表于 2013-4-28 00:12
?和T还是有区别的,T代表任意类型,?也代表任意未知类型,多了个未知,意思就是不能够用?来声明对象
比如 ...

你的程序,我试着编译了下, T obj=it.next();也需要加上泛型<T>,即T obj=(T) it.next();编译才能通过,否则,编译也是不能通过的。
作者: 袁梦希    时间: 2013-4-28 09:01
楼主你好,如果帖子没有问题了,请把帖子的类型改为了“已解决” {:soso_e163:}
作者: 谭威    时间: 2013-4-28 11:28
郑雪 发表于 2013-4-28 08:49
你的程序,我试着编译了下, T obj=it.next();也需要加上泛型,即T obj=(T) it.next();编译才能通过,否则 ...

我直接在这上面写的。需要强制转化成T的。:)
作者: itheima01    时间: 2013-4-28 21:09
{:soso_e109:}{:soso_e115:}
作者: 付鑫鑫    时间: 2013-4-29 09:33
Collection <?> c=new ArrayList<?>();这样只为了提高通用性,就是不知道别人会传什么进来
Collection <String> c=new ArrayList<String>;就是在知道这个集合的类型都是String类才会加上这们的泛型
作者: 吴波    时间: 2013-4-29 16:24
泛型限定:用于泛型扩展
    <?>:其中的?是通配符(占位符),表示不明确的引用类型,不可以接收,所以后面不能使用类型特有方法
    <T>:其中的T是确定了具体的引用类型,可以接收
作者: 黄玉昆    时间: 2013-4-29 23:49
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
作者: Sword    时间: 2013-4-30 01:24
1.使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
2.当传入的类型不确定时,可以使用通配符?
3.可对通配符变量赋任意值:
如:Collection<?> colls---> cols = newHashSet<Date>();
Cols<Object> 中的Object只是说明Cols<Object> 实例对象中的方法接受的参数是Object
Cols<Object> 是一种具体类型,new HashSet<Date>也是一种具体类型,两者没有兼容性问题。
注意:
ollection<?>  a可以与任意参数化的类型匹配,但到底匹配的是什么类型,只有以后才知道,所以,
a=new ArrayList<Integer>和a=new ArrayList<String>都可以, 但a.add(new Date())或a.add(“abc”)都不行,

如:Collection<?> coll ---> coll = newHashSet<Date>();

public static void printObj(Collection<?> coll){
        //coll.add(1);是错误的,如果传入的是String类型,就不符合了
        for(Object obj : coll){
                System.out.println(obj);
        }
}
示例:
  1. import java.util.*;
  2. class GenerticDemo  
  3. {  
  4.     public static void main(String[] args)   
  5.     {  
  6.         ArrayList<String> p = new ArrayList<String>();  
  7.         p.add("per20");  
  8.         p.add("per11");  
  9.         p.add("per52");  
  10.         print(p);  
  11.         ArrayList<Integer> s = new ArrayList<Integer>();  
  12.         s.add(new Integer(4));  
  13.         s.add(new Integer(7));  
  14.         s.add(new Integer(1));  
  15.         print(s);  
  16.     }  
  17.   
  18.     public static void print(ArrayList<?> al) {  
  19.         Iterator<?> it = al.listIterator();  
  20.         while (it.hasNext()) {
  21.             System.out.println(it.next());  
  22.         }  
  23.     }  
  24. }  
复制代码

作者: 符立波    时间: 2013-4-30 10:31
集合本身都不知道里面应该放什么类型,你何以往里面传对象啊,只能传null了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2