import java.util.ArrayList;
import java.util.List;public class Test {    public static void main(String[] args) throws SQLException {       List<? super Fruit> f0=new ArrayList<Fruit>();
       f0.add(new Apple());
       f0.add(new Fruit());
       f0.add(new SupApple());
       
       List<? super Fruit> f1=new ArrayList<Apple>();
       f1.add(new Apple());
       f1.add(new Fruit());
       
       List<? extends Fruit> f2=new ArrayList<Fruit>();
       f2.add(new Apple());
       f2.add(new Fruit());
       
       
       List<? extends Fruit> f3=new ArrayList<Apple>();
       f3.add(new Apple());
       f3.add(new Fruit());
       // f.add(new Apple());
        
       List<? super Apple> f5=new ArrayList<Fruit>();
       f5.add(new Apple());
       f5.add(new SupApple());
       f5.add(new Fruit());
    }
}class Fruit{
}class Apple extends Fruit{
}class SupApple extends Apple{    
}
代码如上,请大家指导,上述代码有多处编译报错,求解:泛型中  extends 和 super的区别!

解决方案 »

  1.   

    List<? extends Fruit> f3的话那么后面ArrayList<..> 中的是Fruit的子类 就是继承自Fruit的
     List<? super Fruit>  f0的话那么后面ArrayList<..> 中的是Fruit的父类 也就是Fruit是他的子类
      

  2.   

    lz可以看看这个。应该有帮助
    http://hi.baidu.com/augustus_blog/item/d9331b3469b65a1d9dc65e69
      

  3.   

    这两个泛型类型
    ? extends xxx 只能用于方法传参,因为jdk能够确定传入为xxx的子类,返回只能用Object类接收
    ? supper xxx 只能用于方法返回,jdk能够确定此类的最小继承边界为xxx,只要是这个类的父类都能接收,但是传入参数无法确定具体类型,只能接受null的传入。
    ? 既不能用于方法参数传入,也不能用于方法返回。具体参见java核心技术,泛型一章。
      

  4.   

    ? extends xxx 只能用于方法传参,因为jdk能够确定传入为xxx的子类,返回只能用Object类接收--->这点说的应该不对吧,返回的应可以用xxx类型接收,因为xxx是下界。个人觉得应该这样理解:
     在泛型中super说明:<? super T> ?代表一种"特定"的类型,且此类型是T类型的父类或T类型,也就是说T是?(这种特定类型而其中比较难理解的是在添加对象时,为什么添加的又是T类型的子类呢?这点仔细想想确实应该是这样,<? super T>这样声明的泛型,是T类型的父类型或T类型的一个泛型,而编译器并不是相当的聪明并不知道这个?代表的确切类型(因为Java中的泛型机制是擦除原则),因此为了确保添加的对象一定是合法的,添加的元素必须是T类型或是T类型的子类。(备注:因为如果? 表示的是 T 类型,这样添加对象的只能是T类型或是其子类,编译器为了确保添加的元素一定合法,所以只能添加T类型或其子类,因为编译器并不知道?代表的类型)       
                                                                       
                                                                       
    在泛型中extends的说明:<? extends T> ?表示一种特定的类型,且是T类型的一种"特定"的子类,也就是说T是?(特定类同样其中比较难理解的是,添加对象,为什么任何类型的对象都无法添加进去泛型呢?,想想如果前面的理解好了,这也不难理解,?是T类型或是其子类,而T类型的子类可能不唯一,编译器又不知道?确切的代表什么类型(只是知道是一种特定的类型,但不确定这种特定的类型是哪种类型)因为T类型的子类型不唯一,所以这种特定的类型编译器又不知道是哪种特定的类型,因此任何类型都无法添加进去。       
      

  5.   

    ? extends xxx 只能用于方法传参,因为jdk能够确定传入为xxx的子类,返回只能用Object类接收--->这点说的应该不对吧,返回的应可以用xxx类型接收,因为xxx是下界。====》理解错了,5楼说的正确,谢谢了!
      

  6.   

    ? extends xxx 只能用于方法传参,因为jdk能够确定传入为xxx的子类,返回只能用Object类接收--->这点说的应该不对吧,返回的应可以用xxx类型接收,因为xxx是下界。====》理解错了,5楼说的正确,谢谢了!
    不知道是不是我理解错了,还是感觉5楼说得不对呢