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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 闪耀.Q 中级黑马   /  2014-6-12 10:19  /  1296 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

菜鸟虚心求教。
泛型中不太明白的问题
一个方法
public static<T> void show(ArrayList<T> al)   
{    Iterator<T> it = al.iterator();
     while(it.hasNext())
     {
         T t = it.next();
         System.out.println(t.length());
      }
}
和另一种写法
public static void show(ArrayList<?> al)        
{
      Iterator<?> it = al.iterator();
      while(it.hasNext())
      {
           System.out.println(it.next().length());
       }
}

看老毕的视频,老毕说,下面这个不对是因为“?”代表不明确的类型,所以无法调用length()方法。
但是上面的为什么会提示编译错误。T不是代表明确的类型么?假如是字符串类型的集合调用,t.length() 也不行。

4 个回复

倒序浏览
T 和 ? 的区别还是不太懂、、
回复 使用道具 举报

public static<T> void show(ArrayList<T> ail)   
        {    Iterator<T> it = ail.iterator();
             while(it.hasNext())
             {
                 T t = it.next();
                 System.out.println(((String) t).length());//这里将t强转为String型对象
              }
        }

你的代码改成如上的样子就能编译通过。
因为你的t类型不确定,t中不一定有length函数,所以会报错。
只要强制转换为拥有length函数的类型即可编译通过。

关于T与?的区别:
说白了就是调用时所有T会替换为同一个确定的类型,
而每一个?调用时是可以分别设定不同的类型的,只要是Object的子类。
不过在你的代码中两种写法效果相同。

回复 使用道具 举报
T其实也是一个不明确类型,如果你T是一个自定义类型,没有length方法,那它怎么调用呢
回复 使用道具 举报
?类型不明确,调用it.next()得到该类型的对象时,该对象不一定有length()方法,故会出错。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马