List<? extends String> list你要理解这个形参的意思,是说你不加泛型,list里面可以存放任意类型的元素,但是一旦加上泛型作为类型限制,list就只能存放某种类型的数据。
这里list中存放继承String类的某一个子类,而继承String类的子类又不确定,你怎么就能决定list中add什么类型的数据呢。就像一个人有三个孩子,你想给二儿子100块钱,现在你都不知道谁是二儿子,就知道他有三个儿子,你怎么给。你肯定郁闷,老是觉得既然不能放字符串,D怎么就对了呢,这么给你说吧,你声明类型的时候是否可以用接口代替实现类,要是你很容易理解这个,那这个是同样道理,真不理解的话,你可以在list = new ArrayList<String>();后面继续写,list.add("xxoo");你会发现同样报错,以为这个泛型只是声明

解决方案 »

  1.   

    string是最终类 ,能有子类? 
      

  2.   

    2楼正解
    你可以写个demo感受下public void test(List<? extends String> list){
    list.add("");
    }eclipse中,直接报错,毫无悬念
      

  3.   

    String类定义是final呀~是终结类啊~
      

  4.   


    你好,对于你讲到的
    "这里list中存放继承String类的某一个子类,而继承String类的子类又不确定,你怎么就能决定list中add什么类型的数据呢"我自己的理解是:
    String是final类型,也就是说不可能有子类,而<? extends String>的意思是说 这里只能存入String的子类才行
    所以没有任何一个对象满足上述条件
    也就是List<? extends String> list  的size()永远返回的是0,
    这也是为什么楼主疑惑的A不能选的原因