请帮忙看看下面的代码,如何在方法中,修改带范型的集合?谢谢!package com.ocjp.generic;import java.util.*;
 
interface Canine { }
class Dog implements Canine { }public class Collie extends Dog {
public static void main(String[] args) {
 List<Dog> d = new ArrayList<Dog>();
 List<Collie> c = new ArrayList<Collie>();
 d.add(new Collie());
 c.add(new Collie());
 do1(d); 
 do1(c);
}
 
static void do1(List<? extends Dog> d2) {
// 下面这句话会报编译错误,我想给d2增加一个值,怎么加?
//  d2.add(new Collie());
 System.out.print(d2.size());
 }}
Javageneric

解决方案 »

  1.   

    泛型在方法重载中,似乎无法作为区别项(因为<>会擦除)。深入也讲不清啦,下~
      

  2.   

    Collie.java:9: 错误: 不兼容的类型
                     List<Dog> c = new ArrayList<Collie>();
    不知如何解决,静等高手,下···
      

  3.   

    你有没有看我在你另一个帖子里的评论,这个add你是加不了的,什么都不行。
    你只能写两个函数,一个叫do1(List<Dog> list),另一个叫do1(List<Collie> list)
      

  4.   

    你的问题可以这么解释,我们不妨假设你的语句成立,那么:
    List<Dog> c = new ArrayList<Collie>();
    c.add(new Collie()); //添加了一个Collie到ArrayList<Collie>,没问题现在假设有另一个类
    Puddle extands Dog {...}
    c.add(new Puddle()); //看上去是对的,Puddle是Dog,Puddle可以放到List<Dog>里面但其实是错的,因为c其实是ArrayList<Collie>,Puddle显然不能放进Collie的列表里。范型的作用就是为了防止这种问题发生,编译器为我们做的检查
      

  5.   

    你的问题可以这么解释,我们不妨假设你的语句成立,那么:
    List<Dog> c = new ArrayList<Collie>();
    c.add(new Collie()); //添加了一个Collie到ArrayList<Collie>,没问题现在假设有另一个类
    Puddle extands Dog {...}
    c.add(new Puddle()); //看上去是对的,Puddle是Dog,Puddle可以放到List<Dog>里面但其实是错的,因为c其实是ArrayList<Collie>,Puddle显然不能放进Collie的列表里。范型的作用就是为了防止这种问题发生,编译器为我们做的检查
    反推的很好~
    请教下,do1(List<? extends Dog> d2)这种方法的声明是不是没有用了?
      

  6.   

    自己试了下,这样就有用了:import java.util.*;interface Canine { }
    class Dog implements Canine { }
     
    public class Collie extends Dog {
        public static void main(String[] args) {
             List<Dog> d = new ArrayList<Dog>();
             List<Collie> c = new ArrayList<Collie>();
             d.add(new Collie());
             c.add(new Collie());
             do1(d); 
             do1(c);
             List<Integer> e = new ArrayList<Integer>();
             do1(e);
        }
          
        static void do1(List<? extends Dog> d2) {
    //        下面这句话会报编译错误,我想给d2增加一个值,怎么加?
             //d2.add(new Dog());
            d2.remove(1);
             System.out.print(d2.size());
         }
    }
      

  7.   

    List<? super Dog> d2
      

  8.   

    http://tieba.baidu.com/p/2033128717
    我记得你好像发过类似的问题,这篇你看了没,你懂了没?