加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

extends与super通配符的差别

发布时间:2021-05-22 04:35:01 所属栏目:编程 来源:互联网
导读:在界说泛型范例Generic 的时辰,也可以行使extends通配符来限制T的范例: public classGenericTextendsNumber{...} 此刻,我们只能界说: GenericNumberp1= null
副问题[/!--empirenews.page--]

在界说泛型范例Generic的时辰,也可以行使extends通配符来限制T的范例:

public class Generic<T extends Number> { ... } 

此刻,我们只能界说:

Generic<Number> p1 = null; 

Generic<Integer> p2 = new Generic<>(1, 2); 

Generic<Double> p3 = null; 

由于Number、Integer和Double都切合。

非Number范例将无法通过编译:

Generic<String> p1 = null; // compile error! 

Generic<Object> p2 = null; // compile error! 

由于String、Object都不切合,由于它们不是Number范例或Number的子类。

我们看一个例子:

public class Test { 

 

    static class Food { 

 

    } 

 

    static class Fruit extends Food { 

    } 

 

    static class Apple extends Fruit { 

    } 

 

    static class Orange extends Fruit { 

    } 

 

    public void testExtend() { 

        List<? extends Fruit> list = new ArrayList<Apple>(); 

 

        //无法安详添加任何具有现实意义的元素,报错,extends为上界通配符,只能取值,不能放. 

        //由于Fruit的子类不但有Apple尚有Orange,这里不能确定详细的泛型到底是Apple照旧Orange,以是放入任何一种范例城市报错 

 

        //list.add(new Apple()); 

        //list.add(new Orange()); 

 

        //可以添加null,由于null可以暗示任何范例 

        list.add(null); 

 

        //可以正常获取,用java多态 

        Food foot = list.get(0); 

        Apple apple = (Apple) list.get(0); 

    } 

 

    public void testSuper() { 

        List<? super Fruit> list = new ArrayList<Fruit>(); 

 

        //super为下界通配符,可以存放元素,可是也只能存放当前类可能子类的实例,以当前的例子来讲, 

        list.add(new Fruit()); 

        list.add(new Apple()); 

 

        //无法确定Fruit的父类是否只有Food一个(Object是超等父类) 

        //因此放入Food的实例编译不通过,只能放本身的实例 可能按照java多态的特征放子类实例 

        //list.add(new Food()); 

        //List<? super Fruit> list2 = new ArrayList<Apple>(); 

        //Fruit fruit = list.get(0); //不能确定返回范例 

 

    } 

 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读