黑马程序员技术交流社区
标题:
关于泛型通配符?扩展的一些问题
[打印本页]
作者:
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
/*①*/ Vector<? extends Number> a = new Vector<Integer>();
a.add(23);//错误。因为此时编译器并不知道你的a中装的是Integer还是Number,如果你是Number类型的,就不可以添加Double类型的。
a.add(new Double(11.1));//错误。道理同上。如果是Integer,就不可以添加Double。
/*①*/ Vector<? super Number> a2 = new Vector<Object>();
a2.add(new Integer(23));//正确。虽然编译器不知道你装的是什么,但是不管你是Object,还是Number都可以添加。因为Integer是Object的子类,而Number也是Object子类
a2.add(new Double(11.1));//正确。道理同上。Double是Object的子类,而Number也是Object子类
/*①*/ Vector<? super Integer> c = new Vector<Number>();
c.add(23);//正确。此时编译器不知道你c中装的是什么。如果是Integer,可以添加23,如果是Number,也可以添加23
c.add(new Long(123l));//错误。同上。如果是Integer,不可以添加Long,对吧?
/*首先,我举得你举的这些例子都很经典,可以用来当教学案例了
*其次,我做一下总结。
*如果要使用add方法,一定要?和T都满足的元素才可以添加,否则会编译失败——原因是编译器并不知道a中是什么类型的
*如果真的要追求根本原因。。。我也解释不清楚,可能要看源码和他的内存结构吧。。。
* */
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2