zoukankan      html  css  js  c++  java
  • JAVA 泛型 通配符? extends super限定,实例区分extends super限定的作用用法

    java泛型中的关键字

    1. ? 表示通配符类型
    2. <? extends T> 既然是extends,就是表示泛型参数类型的上界,说明参数的类型应该是T或者T的子类。
    3. <? super T> 既然是super,表示的则是类型的下界,说明参数的类型应该是T类型的父类,一直到object。

    实例代码看具体的区别

    public class FanXing {
    static class Fruit {
    }

    static class Apple extends Fruit {
    }

    static class Orange extends Apple {
    }

    public static void main(String... args) throws Exception {
    List<? extends Fruit> list = new ArrayList<Orange>();
    //无法安全添加不确定类型的元素
    list.add(new Orange());
    list.add(null);
    Fruit fruit = list.get(0);

    Orange orange = (Orange) list.get(0);

    List<? super Fruit> list1 = new ArrayList<>();
    list1.add(new Orange());
    //无法确定具体的返回类型
    Fruit fruit1 = list1.get(0);
    Orange orange1 = (Orange) list1.get(0);
    }
    }

     来看一下代码编译器中两种不同的限定报错

     extends限定

    List<? extends Fruit> 表示是一个Fruit类弄的或者Fruit子类的泛型
    编译器无法确定List所持有的类型,所以无法安全的向其中添加对象。
    但是可以添加null,因为null可以表示任何类型。
    由于list里面的类型是从Fruit中继承过来的,所以可以安全取出Fruit类型 

     super限定

    List<? super Fruit> 表示是一个Fruit类弄的或者Fruit父类的泛型
    列表的类型至少是一个Fruit类型,因此可以安全的向其中添加Fruit及其子类型
    由于list里面的类型是从Fruit的父类,编译器无法确定返回的类型,所以直接取值时会报错

    小结

    extends 可用于的返回类型限定,不能用于参数类型限定。
    super 可用于参数类型限定,不能用于返回类型限定。
    希望只取出,不插入,就使用? extends
    希望只插入,不取出,就使用? super
    希望,即能插入,又能取出,就不要用通配符?

  • 相关阅读:
    wx.Notebook
    wx.button
    wxpython wx.windows的API
    wxpython Menus and toolbars
    使用 profile 进行python代码性能分析
    html 表格边框的设置
    Java IO方式
    Java文件拷贝方式
    S.O.L.I.D原则
    面向对象设计
  • 原文地址:https://www.cnblogs.com/songpingyi/p/10002018.html
Copyright © 2011-2022 走看看