zoukankan      html  css  js  c++  java
  • 泛型系列教材 (三)- Java 泛型通配符 ? extends super 的用法

    步骤1:? extends
    步骤2:? super
    步骤3:泛型通配符?
    步骤4:总结
    步骤5:练习- extends
    步骤6:答案- extends
    步骤7:练习-二叉树
    步骤8:答案-二叉树

    示例 1 : ? extends

    ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型
    heroList 的泛型可能是Hero
    heroList 的泛型可能是APHero
    heroList 的泛型可能是ADHero
    所以 可以确凿的是,从heroList取出来的对象,一定是可以转型成Hero的

    但是,不能往里面放东西,因为
    放APHero就不满足<ADHero>
    放ADHero又不满足<APHero>

    ? extends

    package generic;

       

    import java.util.ArrayList;

      

    import charactor.ADHero;

    import charactor.APHero;

    import charactor.Hero;

       

    public class TestGeneric {

       

        public static void main(String[] args) {

              

            ArrayList<APHero> apHeroList = new ArrayList<APHero>();

            apHeroList.add(new APHero());

             

            ArrayList<? extends Hero> heroList = apHeroList;

              

            //? extends Hero 表示这是一个Hero泛型的子类泛型

              

            //heroList 的泛型可以是Hero

            //heroList 的泛型可以使APHero

            //heroList 的泛型可以使ADHero

              

            //可以确凿的是,从heroList取出来的对象,一定是可以转型成Hero的

              

            Hero h= heroList.get(0);

              

            //但是,不能往里面放东西

            heroList.add(new ADHero()); //编译错误,因为heroList的泛型 有可能是APHero

              

        }

          

    }

    示例 2 : ? super

    ArrayList heroList<? super Hero> 表示这是一个Hero泛型或者其父类泛型
    heroList的泛型可能是Hero
    heroList的泛型可能是Object

    可以往里面插入Hero以及Hero的子类
    但是取出来有风险,因为不确定取出来是Hero还是Object

    ? super

    package generic;

      

    import java.util.ArrayList;

      

    import charactor.ADHero;

    import charactor.APHero;

    import charactor.Hero;

      

    public class TestGeneric {

        public static void main(String[] args) {

      

            ArrayList<? super Hero> heroList = new ArrayList<Object>();

              

            //? super Hero 表示 heroList的泛型是Hero或者其父类泛型

              

            //heroList 的泛型可以是Hero

            //heroList 的泛型可以是Object

              

            //所以就可以插入Hero

            heroList.add(new Hero());

            //也可以插入Hero的子类

            heroList.add(new APHero());

            heroList.add(new ADHero());

              

            //但是,不能从里面取数据出来,因为其泛型可能是Object,而Object是强转Hero会失败

            Hero h= heroList.get(0);

              

        }

      

    }

    示例 3 : 泛型通配符?

    泛型通配符? 代表任意泛型
    既然?代表任意泛型,那么换句话说,这个容器什么泛型都有可能

    所以只能以Object的形式取出来
    并且不能往里面放对象,因为不知道到底是一个什么泛型的容器

    泛型通配符?

    package generic;

      

    import java.util.ArrayList;

    import property.Item;

    import charactor.APHero;

    import charactor.Hero;

      

    public class TestGeneric {

      

        public static void main(String[] args) {

      

            ArrayList<APHero> apHeroList = new ArrayList<APHero>();

             

            //?泛型通配符,表示任意泛型

            ArrayList<?> generalList = apHeroList;

            //?的缺陷1: 既然?代表任意泛型,那么换句话说,你就不知道这个容器里面是什么类型

            //所以只能以Object的形式取出来

            Object o = generalList.get(0);

            //?的缺陷2: 既然?代表任意泛型,那么既有可能是Hero,也有可能是Item

            //所以,放哪种对象进去,都有风险,结果就什么什么类型的对象,都不能放进去

            generalList.add(new Item()); //编译错误 因为?代表任意泛型,很有可能不是Item

            generalList.add(new Hero()); //编译错误 因为?代表任意泛型,很有可能不是Hero

            generalList.add(new APHero()); //编译错误  因为?代表任意泛型,很有可能不是APHero

      

        }

    }

    示例 4 : 总结

    如果希望只取出,不插入,就使用? extends Hero
    如果希望只插入,不取出,就使用? super Hero
    如果希望,又能插入,又能取出,就不要用通配符?


    更多内容,点击了解: https://how2j.cn/k/generic/generic-wildcard/376.html

  • 相关阅读:
    css3边框阴影属性
    web移动端浮层滚动阻止window窗体滚动JS/CSS处理
    css3字体尺寸font-size-adjust属性
    css3文本溢出使用省略标记(…)
    exports 和 module.exports 的区别
    微信小程序——try {} catch (e) {}
    flex布局
    微信小程序——data-*自定义属性
    CSS 隐藏滚动条 但可以滚动
    event.target 和 event.currentTarget 的区别
  • 原文地址:https://www.cnblogs.com/Lanht/p/12615483.html
Copyright © 2011-2022 走看看