public static void main(String []args)
{
List <? extends Number> list = new ArrayList<Integer>();
test(list);
} public static void  test(List <? extends Number> list)
{
list.add(new Integer(1)); //这里有错误,必须这样写才可以 list.add(new Integer(1),null),为什么?
}

解决方案 »

  1.   

    List<? extends Number>中不能添加非空元素,因为编译器不知道?指的究竟是Number的子类A还是Number的子类B,亦或是其他子孙类,显然子类A与子类B之间不能相互转换的。
    list.add(new Integer(1),null)调用的是add(int index, E element),即传入的元素是null,而new Integer(1)会自动拆箱为整数1,所以能够编译通过。
    import java.util.*;public class Test
    {
    public static void main(String []args)
    {
    List <? extends Number> list = new ArrayList<Integer>();
    test(list);
    }

    public static void test(List <? extends Number> list)
    {
    list.add(1, null); //这里有错误,必须这样写才可以 list.add(new Integer(1),null),为什么?
    }
    }
      

  2.   


     public static void test(List <? extends Number> list)
        {
            list.add(1,new Integer (1)); //仍然会出现错误,而且不能用list.add(E e),太尴尬了.
        }
      

  3.   

    去看API,方法参数的个数和含义要搞清楚啊
      

  4.   

    呃  这个建议多去看下 List 的 API
      

  5.   


    public static void main(String[] args) {
    List<Number> list = new ArrayList<Number>();
    test(list);
    } public static void test(List<? super Number> list) {
    list.add(new Integer(1)); 
    }
      

  6.   

    我看api中有add(E e)的方法但是为什么我的用不了呢.为什么在应用这种<? extends Number>泛型的时候不能应用add(E e) 而必须应用 add(int i,E e) 呢?
      

  7.   


    这样做的话 list只能接受 Number及其超类的类型了 不是我想要的结果,我想要的是list必须是Float,Integer,Double等等,但是他们中的任何一种list里必须保证不能存在其他类型的对象,如Float中部能存在Integer,即使你故意插入也会报错这样的.
      

  8.   

    List <? extends Number> list = new ArrayList<Integer>();
    为何不直接List <Integer> list = new ArrayList<Integer>();
      

  9.   


    我理解你的意思是否就是:
    list<Integer> intList;
    List<Float> floatList;
    List<Double> doubleList;
      

  10.   


    恩对就是这个意思 ,这个List <? extends Number>是笔误,当时做测试的时候没改掉.....
      

  11.   


    public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>();
    test(list,new Integer(10));
    // test(list,new Double(10));
    } public static <T extends Number> void test(List<T> list,T number) {
    list.add(number);
    }
      

  12.   

    楼主没有搞清楚extends和super在泛型中的区别//Apple Orange 都继承自Fruit类,同时Jonathan是Apple的子类    
    List<? extends Fruit> list = new ArrayList<Apple>();    
    //list.add(new Apple());Error    
    //list.add(new Fruit());Error    
       
    List<? super Fruit> list = new ArrayList<Apple>();    
    list.add(new Apple());//可以    
    list.add(new Fruit());//可以    
       
    List<? extends Fruit> list = new ArrayList<Apple>();    
    list中为什么不能加入Fruit类和Fruit类的子类呢,原因是这样的    
       List<? extends Fruit>表示上限是Fruit,下面这样的赋值都是合法的    
       List<? extends Fruit> list1 = new ArrayList<Fruit>();    
       List<? extends Fruit> list2 = new ArrayList<Apple>();    
       List<? extends Fruit> list3 = new ArrayList<Jonathan>();    
       如果List<? extends Fruit>支持add方法的方法合法的话    
       list1可以add Fruit和所有Fruit的子类    
       list2可以add Apple和所有Apple的子类    
       list3可以add Jonathan和所有Jonathan的子类    
       这样的话,问题就出现了    
       List<? extends Fruit>所应该持有的对象是Fruit的子类,而且具体是哪一个    
       子类还是个未知数,所以加入任何Fruit的子类都会有问题,因为如果add Apple    
       的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan>()    
       Apple的加入肯定是不行的,如果 如果add Jonathan    
       的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan的子类>()    
       Jonathan的加入又不合法,所以List<? extends Fruit> list 不能进行add    
       
           
       而List<? super Fruit> list 表示list持有的对象是Fruit的父类,下限是 Fruit,所以list中add Fruit或Fruit的子类是没有问题的 
      

  13.   

    public static void main(String[] args)
    {
        List <Number> list = new ArrayList<Number>();
        test(list);
    }
    public static void test(List<Number> list)
    {
        list.add(new Integer(1));
    }小小问题 干嘛 搞那 复杂
      

  14.   

    @SuppressWarnings("unchecked")
    public static void test(List<? extends Number> list)
    {
    ((List<Number>)(list)).add(new Integer(1));
    }
    防止 Number 被添加