Java泛型--extensとsuper>


Java泛型--目次
概要
  • はタイプの上界を表し、パラメータ化タイプの可能性がTまたはTのサブクラス
  • を表しています。
  • は、タイプ下界を表し、パラメータ化タイプがこのタイプの超タイプ(親タイプ)であることを示し、Object
  • まで
    具体的な説明は次の例に参加してください。
    public class SuperExtneds {
        public static void main(String[] args) {
            List<? extends Apple> list1 = getExtendsAppleList();
            Apple first = list1.get(0);
            list1.add(null);
    
            first.sayHello();
    
            //    
            //list.add(new Fruit());
            //list.add(new Apple())
            //list.add(new Object());
    
            List<? super Apple> list2 = getSupperAppleList();
            list2.add(new Apple());
            list2.add(new HFSApple());
            //    obj
            Object item = list2.get(0);
    
            //     
            //Fruit aa1 = list2.get(0);
            //Apple aa2 = list2.get(0);
            //HFSApple aa3 = list2.get(0);
            //Orange aa4 = list2.get(0);
            //list2.add(new Fruit());
    
            List<Fruit> list3 = new ArrayList<>();
            handlerApple(list3);
            list3.get(0).sayHello();
    
        }
    
        public static List<? extends Apple> getExtendsAppleList() {
            List<Apple> appleList = new ArrayList<>();
            appleList.add(new Apple());
            appleList.add(new HFSApple());
    
            //    
            //return new ArrayList<Fruit>();
    
            return appleList;
        }
    
        public static List<? super Apple> getSupperAppleList() {
            List<Fruit> fruitList = new ArrayList<>();
            fruitList.add(new Fruit());
            fruitList.add(new Orange());
    
            //    
            //return new ArrayList<HFSApple>();
    
            return fruitList;
        }
    
        public static void handlerApple(List<? super Apple> list) {
            list.add(new HFSApple());
            list.add(new Apple());
    
            //    
            //list.add(new Fruit());
            //list.add(new Orange());
        }
    }
    
    class Fruit {
        public void sayHello() {
            System.out.println("hello");
        }
    }
    
    class Apple extends Fruit {
    }
    
    class HFSApple extends Apple {
    }
    
    class Orange extends Fruit {
    }
        Listlist 1は、あるタイプのオブジェクトしか入手できません。その中にFlut、Orange、さらにAppleのインスタンスを追加できないのは、なぜですか?そうですかexpends Appleの意味はAppleまたはAppleのサブクラスです。これは不確定なタイプです。Listはどのタイプのオブジェクトを入れるべきか分からないので、どのタイプのオブジェクトを追加してもいけません。
        Listlist 2は、Apple、HFSF AppleなどのAppleとそのサブクラスを追加することができますが、Appleの親クラスを追加することはできません。list 2のオブジェクトを取得する時はObjectしかできません。これはなぜですか?もとはsuper AppleはAppleまたはAppleの親類を表しています。Objectまでは、範囲があるなら、この範囲にAppleまたはAppleのサブクラスを追加してもいいですが、取得時には限られた範囲がありますので、list 2は具体的に持つべきタイプが何なのか分かりません。
        リスト3は簡単に表現しましたか?super Appleの応用シーン、
        次のようにまとめます。
  • extensで使用できるリターンタイプは、パラメータタイプの定義には使用できません。
  • superは、パラメータタイプによって定義されることができ、リターンタイプによって定義されることができない。
  • eg:
        ここまで話してください。その中の奥秘が分かりました。ここで問題を出します。次の二つの例に注釈されたreturn文はなぜ新聞をコンパイルしたかを説明してください。
    public static List<? extends Apple> getExtendsAppleList() {
        List<Apple> appleList = new ArrayList<>();
        appleList.add(new Apple());
        appleList.add(new HFSApple());
    
        //    
        //return new ArrayList<Fruit>();
    
        return appleList;
    }
    public static List<? super Apple> getSupperAppleList() {
        List<Fruit> fruitList = new ArrayList<>();
        fruitList.add(new Fruit());
        fruitList.add(new Orange());
    
        //    
        //return new ArrayList<HFSApple>();
    
        return fruitList;
    }