黑马程序员技术交流社区
标题:
通配符疑惑
[打印本页]
作者:
唐长智
时间:
2013-3-1 15:50
标题:
通配符疑惑
package Test;
class Text{
public static void main(String[] args){
demo<String> d = new demo<String>();
d.setName("a");
System.out.println(d.getName());
demo<? extends Object> d1 = d;
System.out.println(d1.getName());
d1.setName("sss");//在物联云的版块中看到有同学提问为什么这里无法设置。
//去看了视频,原因应该是:使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,
//可以调用与参数化无关的方法,不能调用与参数化有关的方法。
//但是张孝祥老师却没有讲为什么不能调用与参数化有关的方法,不知道哪位同学能详细解答下。
}
}
class demo<T>{
private T name;
public T getName()
{
return name;
}
public void setName(T name)
{
this.name = name;
}
}
复制代码
附上原帖
http://bbs.itheima.com/thread-39323-1-1.html
作者:
刘圣繁
时间:
2013-3-1 18:14
错误方法
public static void printCollection(Collection<Object> cols){
for(Object obj:cols){
System.out.println(obj);
}
cols.add("String");//没错
cols=new HashSet<Date>();//会报告错误
}
正确方法:
public static void printCollection(Collection<?>cols){
for(Object obj:cols){
System.out.printlln(obj);
}
cols.add("String");//错误 因为它不知道未来匹配的就一定是字符串
cols.size();//没错 此方法与类型参数没有关系
cols=new HashSet<Date>();//正确
}
总结:使用通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用于引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
因为并不知道未来匹配的就一定是某个类型的参数
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2