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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© itheima01 中级黑马   /  2013-4-27 22:26  /  2322 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 itheima01 于 2013-4-30 19:45 编辑

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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

14 个回复

正序浏览
集合本身都不知道里面应该放什么类型,你何以往里面传对象啊,只能传null了
回复 使用道具 举报
Sword 金牌黑马 2013-4-30 01:24:11
13#
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. }  
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
泛型限定:用于泛型扩展
    <?>:其中的?是通配符(占位符),表示不明确的引用类型,不可以接收,所以后面不能使用类型特有方法
    <T>:其中的T是确定了具体的引用类型,可以接收
回复 使用道具 举报
Collection <?> c=new ArrayList<?>();这样只为了提高通用性,就是不知道别人会传什么进来
Collection <String> c=new ArrayList<String>;就是在知道这个集合的类型都是String类才会加上这们的泛型
回复 使用道具 举报
{:soso_e109:}{:soso_e115:}
回复 使用道具 举报
谭威 中级黑马 2013-4-28 11:28:28
8#
郑雪 发表于 2013-4-28 08:49
你的程序,我试着编译了下, T obj=it.next();也需要加上泛型,即T obj=(T) it.next();编译才能通过,否则 ...

我直接在这上面写的。需要强制转化成T的。:)
回复 使用道具 举报
楼主你好,如果帖子没有问题了,请把帖子的类型改为了“已解决” {:soso_e163:}
回复 使用道具 举报
谭威 发表于 2013-4-28 00:12
?和T还是有区别的,T代表任意类型,?也代表任意未知类型,多了个未知,意思就是不能够用?来声明对象
比如 ...

你的程序,我试着编译了下, T obj=it.next();也需要加上泛型<T>,即T obj=(T) it.next();编译才能通过,否则,编译也是不能通过的。
回复 使用道具 举报
?和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());
                }
        }

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
c.add("5"); c.add(5); 编译失败。
回复 使用道具 举报
?代表匹配任何类型

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

回复 使用道具 举报
?是代表可以在集合中存放任意数据类型?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马