Sobes.tech
Middle

Ինչ է wildcard-ը Java-ում?

sobes.tech AI

Պատասխան AI-ից

Java-յում բուֆերային նշանը (?) օգտագործվում է գեներիկների (generics) մեջ՝ անհայտ տիպը ներկայացնելու համար: Դա թույլ է տալիս աշխատել տարբեր համատեղելի տիպերի տարրեր պարունակող հավաքածուների հետ՝ առանց կոնկրետ տիպին խիստ կապված լինելու:

Հիմնական օգտագործման դեպքերը՝

  1. ? (Վերին սահմանափակված Վարպետային նշան): Նշում է ցանկացած տիպ, որը ժառանգում է կամ իրականացնում է նշված դասը/ինտերֆեյսը: Օգտագործվում է տվյալների ընթերցման համար հավաքածուից: Օրինակ՝ List<? extends Number> կարող է պարունակել List<Integer>, List<Double>, .getList<Long>:

    // Ավելին ընթերցում վերին սահմանափակմամբ
    public void processNumbers(List<? extends Number> numbers) {
        for (Number n : numbers) {
            System.out.println(n);
        }
        // numbers.add(new Integer(10)); // Սխալ՝ չի կարելի ավելացնել տարրեր
    }
    
  2. ? (Նվազագույն սահմանափակված Վարպետային նշան): Նշում է ցանկացած տիպ, որը նախորդում է նշված դասին/ինտերֆեյսին կամ հենց այդ դասը/ինտերֆեյսը: Օգտագործվում է տվյալների գրանցման համար հավաքածուում (պահպանելով PECS սկզբունքը՝ Producer Extends, Consumer Super): Օրինակ՝ List<? super Integer> կարող է պարունակել List<Integer>, List<Number>, List<Object>:

    // Գրանցում հավաքածուում ստորին սահմանափակմամբ
    public void addIntegers(List<? super Integer> list) {
        list.add(1);
        list.add(new Integer(2));
        // Object o = list.get(0); // Վերադարձնում է Object, քանի որ ճշգրիտ տիպը անհայտ է
    }
    
  3. ? (Անսահմանափակ Վարպետային նշան): Նշում է ցանկացած տիպ, համարժեք է ? extends Object}-ին: Օգտագործվում է, երբ կարևոր չէ հավաքածուի տարրերի ճշգրիտ տիպը, օրինակ՝ չափը ստուգելու կամ մաքրման համար:

    // Աշխատանք ցանկացած տիպի հավաքածուի հետ
    public void printList(List<?> list) {
        for (Object obj : list) {
            System.out.println(obj);
        }
        // list.add("hello"); // Սխալ՝ չի կարելի ավելացնել տարրեր (հատկապես null-ից բացի)
    }
    

Վարպետային նշանները մեծացնում են կոդի ճկունությունը՝ թույլ տալով մեթոդներին աշխատել ավելի լայն տիպերի հավաքածուների հետ՝ պահպանելով տիպային անվտանգությունը: Դրանց օգնությամբ կարելի է խուսափել նույնատիպ գործողություններ կատարող մեթոդների կոդի կրկնությունից տարբեր, բայց համատեղելի տիպերի հավաքածուների վրա։