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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王士铭 黑马帝   /  2011-8-5 04:01  /  2768 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[code=java]public void add(List<? extends String> list){
                list.add("xyz");
        }[/code]泛型通配符的限制 为什么不可以这样子 "xyz"不是没有超过String吗

4 个回复

倒序浏览
[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:29
藤椅
<? extends String>是不能添加的。除null外。
把<? extends String>改成List<? super String>或者改成List<String>就可以添加了。
回复 使用道具 举报

回复 楼主 的帖子

String,字符串是不可变的,final的,还extends String 呢?不行的。
[ 本帖最后由 fenglh 于 2011-08-08  07:37 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-8-8 08:23:37
报纸
String类绝育的,修饰符为final
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马