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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wssjdysf 中级黑马   /  2013-11-19 02:54  /  1197 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

            Vector<? extends Number> a = new Vector<Integer>();
            a.add(new Integer(23));//为什么这个报错,我想往a里面添加一个东西怎么做
            a.add(new Double(11.1));//这个也报错,不是说可以装Number的子类吗?
            Vector<? super Number> a2 = new Vector<Object>();
            a2.add(new Integer(23));//为什么这样写还对了(Integer是Number的子类)
            a2.add(new Double(11.1));//(Double是Number的子类)
//         Vector<? extends Number> b = new Vector<String>();
            Vector<? super Integer> c = new Vector<Number>();
            c.add(23);
            c.add(new Long(123l));//Long是Number的子类,怎么又错啊
问题多,还有点乱。。。我现在头也乱了

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

3 个回复

倒序浏览
class Text3{
        public static void main(String[] args){
                demo<String> d = new demo<String>();
                d.setName("a");
                System.out.println(d.getName());
                //demo<?> d1 表示它可接收demo类中泛型类型为任意引用类型的demo对象的引用。
                //此处它的用法类似于多态
                demo<?> d1 = d;

                //这里可以取值,是因为该方法是与泛型类型参数无关的方法(该方法不用接收泛型类型参数)。
                //也就是说:你上面因事先就声明了它里面的类型,里面声明的什么类型,
                //我调用该方法时就返回什么类型就行了。
                System.out.println(d1.getName());

                //这里不能赋值是因为,d1中的泛型类型为不具体类型,
                //也就是说,连它自己都不知道它中的泛型类型是什么
                //具体类型(它不知道自己是什么类型的,并不表示你就可以像其中放任何引用类型),
                //你怎么能给它赋String类型的呢?
                d1.setName("sss");
        }
}
class demo<T>{
        private T name;
        public T getName()
        {
                return name;
        }
        public void setName(T name)
        {
                this.name = name;
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
  1. /*①*/        Vector<? extends Number> a = new Vector<Integer>();
  2.         a.add(23);//错误。因为此时编译器并不知道你的a中装的是Integer还是Number,如果你是Number类型的,就不可以添加Double类型的。
  3.         a.add(new Double(11.1));//错误。道理同上。如果是Integer,就不可以添加Double。
  4.         
  5. /*①*/        Vector<? super Number> a2 = new Vector<Object>();
  6.         a2.add(new Integer(23));//正确。虽然编译器不知道你装的是什么,但是不管你是Object,还是Number都可以添加。因为Integer是Object的子类,而Number也是Object子类
  7.         a2.add(new Double(11.1));//正确。道理同上。Double是Object的子类,而Number也是Object子类

  8. /*①*/   Vector<? super Integer> c = new Vector<Number>();
  9.         c.add(23);//正确。此时编译器不知道你c中装的是什么。如果是Integer,可以添加23,如果是Number,也可以添加23
  10.         c.add(new Long(123l));//错误。同上。如果是Integer,不可以添加Long,对吧?
  11.         
  12.        /*首先,我举得你举的这些例子都很经典,可以用来当教学案例了
  13.         *其次,我做一下总结。
  14.                *如果要使用add方法,一定要?和T都满足的元素才可以添加,否则会编译失败——原因是编译器并不知道a中是什么类型的
  15.                *如果真的要追求根本原因。。。我也解释不清楚,可能要看源码和他的内存结构吧。。。
  16.         * */
复制代码

评分

参与人数 1技术分 +1 收起 理由
To + 1

查看全部评分

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