Java 范型中的super和extends的区别

其实一句话就是:

super最好用来作为输出参数,extends最好用来作为输入参数;

看看下面的例子:

    private class A {
        //
    }

    private class B extends A {
        //
    }

    private class C extends B {
        //
    }

    public void test() {
        List<? super B> test = new ArrayList();
        test = new ArrayList<A>();
        test = new ArrayList<B>();
        test = new ArrayList<C>(); //不能接受比B还小的类

        A a = test.get(0);//不能get
        B b = test.get(0);//不能get
        C c = test.get(0);//不能get

        test.add(new A());//但是不能add比B大的类
        test.add(new B());
        test.add(new C());

        List<? extends B> test1 = new ArrayList();
        test1 = new ArrayList<A>();//不能接受比B大的类
        test1 = new ArrayList<B>();
        test1 = new ArrayList<C>();

        A a1 = test1.get(0);
        B b1 = test1.get(0);
        C c1 = test1.get(0);//但是不能get比B小的类

        test1.add(new A());//不能add
        test1.add(new B());//不能add
        test1.add(new C());//不能add

    }

下面是在Eclipse中的编译错误截图:

具体的原因可以参见:

http://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java

http://docs.oracle.com/javase/tutorial/java/generics/capture.html

时间: 2024-10-13 07:26:51

Java 范型中的super和extends的区别的相关文章

Java范型随笔

最近在帝都好无聊啊, 排遣寂寞就只有让自己不要停下来,不断的思考了 QWQ; 最近做ndk, java有点忘了,突然看到了一些java范型方面的问题, 踌躇了一会, 想着想着,决定还是写个随笔记录下来. 范型语法这个网上找度娘可以要到一大把, 我就不记了, 主要是范型上下限问题. 案例: public class Test { public static class Base{ } public static class A extends Base{ } public static class

JAVA范型-基础

JAVA范型-基础 一.泛型的概念 1.实现了参数化类型 2.用于编写可应用于多种类型的代码,即所编写的代码可应用于许多许多的类型. 3.范型容器.范型接口.范型方法都是经典的用法. 二.泛型与多态 1.多态是一种泛化机制.在使用类型说明的地方,使用多态确实具备一定的灵活性.但,多态是受限制的:只能接受基类或其子类(拘泥于单继承体系,使程序受限太多).而且,在实际编写代码时,只能使用已存在的基类或接口.同时,一旦指明了接口,程序就会要求你的代码必须使用特定接口(方法). 2.泛型:使我们能够编写

java范型集合中的成员排序

范型集合中的类是JsonObject,不是自定义类,如果是自定义类就直接取要比较的字段值. 1 ArrayList<JSONObject> TList = new ArrayList<JSONObject>(); 2 3 for(int i=0;i<10000;i++) 4 { 5 JSONObject object=new JSONObject(); 6 Random rand = new Random(); 7 int randNum = rand.nextInt(200

由Cannot create a generic array of ArrayList&lt;xx&gt;引出的学习--Java范型

最近在用Java写某个程序时希望写出一个包括ArrayList<xx>的数组 自己定义如下: ArrayList<edge>[] edges = new ArrayList<edge>()[10]; 然后编译器报错如下: Cannot create a generic array of ArrayList<edge>; 在C++里可以这样比较方便的定义:  vector<edge> a[100]; 在Java里报错,查询了一下,见已经有人在sta

JAVA编程思想中总结的与C++的区别

(1) 最大的障碍在于速度:解释过的Java要比C的执行速度慢上约20倍.无论什么都不能阻止Java语言进行编译.写作本书的时候,刚刚出现了一些准实时编译器,它们能显著加快速度.当然,我们完全有理由认为会出现适用于更多流行平台的纯固有编译器,但假若没有那些编译器,由于速度的限制,必须有些问题是Java不能解决的. (2) 和C++一样,Java也提供了两种类型的注释.(3) 所有东西都必须置入一个类.不存在全局函数或者全局数据.如果想获得与全局函数等价的功能,可考虑将static方法和stati

java面试题总结之super()与this()的区别

super()与this()的区别? this()调用当前对象的无参构造函数,super()调用父类的无参构造函数 1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) 2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句) 3)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名    super.成员函数据名(实参) 4)this:它代表

Java范型之T extends Comparable&lt;? super T&gt;

在观察Java源码的时候,发现了这么一个写法T extends Comparable<? super T>.不禁纳闷为什么要这么写呢?有什么好处吗,extends和super在这里的作用着实让人有点不清楚. 接下来,我将结合代码跟大家分享一下我关于这里泛型应用的看法. 1.<T extends Comparable<? super T>>代表什么意思 大家可以明白的是这里应用到了Java的泛型,那么首先向大家说明一下这里extends的作用 extends后面跟的类型,

java 范型的那点事

1. 泛型概念 顾名思义,类型参数化(Generics) 2.未检查的类型转换 给一个原生类型赋值一个泛型类型 Box rawBox = new Box(); // rawBox is a raw type of Box<T> Box<Integer> intBox = rawBox; // warning: unchecked conversion 使用一个原生类型引用调用一个泛型类型引用的泛型方法时 Box<String> stringBox = new Box&l

使用Struts框架的Java Web项目中的两个Session的区别和常见的Session取值为空的错误

我的百度知道回答,感觉这个知识很有意义,专门贴出来. 不过还有待验证的地方,就是 ActionContext.getContext().getSession("name", "Tom"); //如果在JSP中通过 EL 或者 Struts2 标签怎么显示? 以下是回答正文. 很多初学Java Web的同学因为使用 Strut2框架而分不清两个 Session的区别. 1.   JSP/Servlety有个原生的 session 对象,这是9大内置对象中的一个,书上写