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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐长智 中级黑马   /  2013-3-1 15:50  /  1663 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package Test;

  2. class Text{
  3.         public static void main(String[] args){
  4.                         demo<String> d = new demo<String>();
  5.                         d.setName("a");
  6.                         System.out.println(d.getName());
  7.                         demo<? extends Object> d1 = d;
  8.                         System.out.println(d1.getName());
  9.                         d1.setName("sss");//在物联云的版块中看到有同学提问为什么这里无法设置。
  10. //去看了视频,原因应该是:使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,
  11. //可以调用与参数化无关的方法,不能调用与参数化有关的方法。
  12. //但是张孝祥老师却没有讲为什么不能调用与参数化有关的方法,不知道哪位同学能详细解答下。

  13.         }
  14. }

  15. class demo<T>{
  16.         private T name;

  17.         public T getName()
  18.         {
  19.                 return name;
  20.         }

  21.         public void setName(T name)
  22.         {
  23.                 this.name = name;
  24.         }

  25. }
复制代码
附上原帖http://bbs.itheima.com/thread-39323-1-1.html

1 个回复

倒序浏览
错误方法
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>();//正确
}
总结:使用通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用于引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
因为并不知道未来匹配的就一定是某个类型的参数

评分

参与人数 1技术分 +1 收起 理由
高境 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马