Ինչ է wildcard-ը Java-ում?
sobes.tech AI
Պատասխան AI-ից
Java-յում բուֆերային նշանը (?) օգտագործվում է գեներիկների (generics) մեջ՝ անհայտ տիպը ներկայացնելու համար: Դա թույլ է տալիս աշխատել տարբեր համատեղելի տիպերի տարրեր պարունակող հավաքածուների հետ՝ առանց կոնկրետ տիպին խիստ կապված լինելու:
Հիմնական օգտագործման դեպքերը՝
-
?(Վերին սահմանափակված Վարպետային նշան): Նշում է ցանկացած տիպ, որը ժառանգում է կամ իրականացնում է նշված դասը/ինտերֆեյսը: Օգտագործվում է տվյալների ընթերցման համար հավաքածուից: Օրինակ՝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)); // Սխալ՝ չի կարելի ավելացնել տարրեր } -
?(Նվազագույն սահմանափակված Վարպետային նշան): Նշում է ցանկացած տիպ, որը նախորդում է նշված դասին/ինտերֆեյսին կամ հենց այդ դասը/ինտերֆեյսը: Օգտագործվում է տվյալների գրանցման համար հավաքածուում (պահպանելով 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, քանի որ ճշգրիտ տիպը անհայտ է } -
?(Անսահմանափակ Վարպետային նշան): Նշում է ցանկացած տիպ, համարժեք է? extends Object}-ին: Օգտագործվում է, երբ կարևոր չէ հավաքածուի տարրերի ճշգրիտ տիպը, օրինակ՝ չափը ստուգելու կամ մաքրման համար:// Աշխատանք ցանկացած տիպի հավաքածուի հետ public void printList(List<?> list) { for (Object obj : list) { System.out.println(obj); } // list.add("hello"); // Սխալ՝ չի կարելի ավելացնել տարրեր (հատկապես null-ից բացի) }
Վարպետային նշանները մեծացնում են կոդի ճկունությունը՝ թույլ տալով մեթոդներին աշխատել ավելի լայն տիպերի հավաքածուների հետ՝ պահպանելով տիպային անվտանգությունը: Դրանց օգնությամբ կարելի է խուսափել նույնատիպ գործողություններ կատարող մեթոդների կոդի կրկնությունից տարբեր, բայց համատեղելի տիպերի հավաքածուների վրա։