黑马程序员技术交流社区

标题: 关于泛型通配符?扩展的一些问题 [打印本页]

作者: wssjdysf    时间: 2013-11-19 02:54
标题: 关于泛型通配符?扩展的一些问题
            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的子类,怎么又错啊
问题多,还有点乱。。。我现在头也乱了
作者: 陈文杰    时间: 2013-11-19 04:18
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;
        }
}

作者: 黄炳期    时间: 2013-11-19 12:42
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
作者: spiderman    时间: 2013-11-19 13:15
  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.         * */
复制代码





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