黑马程序员技术交流社区
标题:
泛型通配符的限制 为什么不可以这样子
[打印本页]
作者:
王士铭
时间:
2011-8-5 04:01
标题:
泛型通配符的限制 为什么不可以这样子
[code=java]public void add(List<? extends String> list){
list.add("xyz");
}[/code]泛型通配符的限制 为什么不可以这样子 "xyz"不是没有超过String吗
作者:
詹季春
时间:
2011-8-5 04:20
[code=java]public void add(List<? extends String> list){
list.add("xyz");
}[/code]这个代码我们不知道这个受限制的通配符的具体类型是什么 ,所以我们不能把xyz添加进去
我们看一下List接口源代码:[code=java]//定义接口时候指定了一个类型形参,该形参名为E
public interface List<E>
{
//在该接口里面,E可以作为类型使用
//下面方法可以使用E昨晚参数类型
void add(E x) ;
}[/code]从上面可以看出add方法有类型参数E作为集合的元素类型,所以我们传给add的参数必须是E类的对象或者其子类的对象--
注意是在使用的时候传进去才知道是什么类型
,但是因为在这个例子中现在还不知道是什么类型,我们只知道它的上限是String类型,所以程序依然无法将任何的对象“丢进”集合。但是null例外,因为他是所有引用类型的实例
可以考虑这样[code=java]public <T> void add(List<? extends T> list){
}[/code]
[
本帖最后由 詹季春 于 2011-08-05 08:58 编辑
]
作者:
匿名
时间:
2011-8-5 09:47
<? extends String>是不能添加的。除null外。
把<? extends String>改成List<? super String>或者改成List<String>就可以添加了。
作者:
冯龙辉
时间:
2011-8-8 07:34
标题:
回复 楼主 的帖子
String,字符串是不可变的,final的,还extends String 呢?不行的。
[
本帖最后由 fenglh 于 2011-08-08 07:37 编辑
]
作者:
匿名
时间:
2011-8-8 08:23
String类绝育的,修饰符为final
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2