黑马程序员技术交流社区

标题: 泛型的一点问题 [打印本页]

作者: 闪耀.Q    时间: 2014-6-12 10:19
标题: 泛型的一点问题
菜鸟虚心求教。
泛型中不太明白的问题
一个方法
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() 也不行。

作者: 闪耀.Q    时间: 2014-6-12 10:21
T 和 ? 的区别还是不太懂、、
作者: lzy418    时间: 2014-6-14 16:31

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的子类。
不过在你的代码中两种写法效果相同。


作者: Без_тебя    时间: 2014-6-14 21:53
T其实也是一个不明确类型,如果你T是一个自定义类型,没有length方法,那它怎么调用呢
作者: 土突突    时间: 2014-6-16 16:10
?类型不明确,调用it.next()得到该类型的对象时,该对象不一定有length()方法,故会出错。




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