黑马程序员技术交流社区
标题:
泛型的一点问题
[打印本页]
作者:
闪耀.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