V Java Generics se zástupné znaky používají, když neznáte přesný typ. Umožňují vám psát flexibilní a opakovaně použitelný kód. Zástupný znak je reprezentován ? (otazník). Zástupné znaky se používají hlavně v parametrech metod k bezpečnému přijetí různých generických typů.
Typy zástupných znaků v Javě
1. Horní ohraničené zástupné znaky
Tyto zástupné znaky lze použít, když chcete uvolnit omezení pro proměnnou. Řekněme například, že chcete napsat metodu, která funguje na Seznam< Integer >Seznam< Double >a Seznam< Number >můžete to provést pomocí zástupného znaku s horní hranicí.
Chcete-li deklarovat zástupný znak s horní hranicí, použijte zástupný znak ('?') následovaný klíčovým slovem extends následovaným jeho horní hranicí.
public static void add(Seznam extends Number>seznam)
Panel nástrojů rychlého přístupu ms word
Implementace:
Javaimport java.util.Arrays; import java.util.List; class WildcardDemo { public static void main(String[] args) { // Upper Bounded Integer List List<Integer> list1 = Arrays.asList(4 5 6 7); System.out.println('Total sum is:' + sum(list1)); // Double list List<Double> list2 = Arrays.asList(4.1 5.1 6.1); System.out.print('Total sum is:' + sum(list2)); } private static double sum(List extends Number> list) { double sum = 0.0; for (Number i : list) { sum += i.doubleValue(); } return sum; } }
Výstup
Total sum is:22.0 Total sum is:15.299999999999999
Vysvětlení: Ve výše uvedeném programu list1 obsahuje celočíselné hodnoty a seznam2 obsahuje hodnoty Double. Oba jsou předány metodě součtu, která používá zástupný znak extends Number>. To znamená, že může přijmout jakýkoli seznam typu, který je podtřídou čísla jako Integer nebo Double.
2. Dolní ohraničené zástupné znaky
Vyjadřuje se pomocí zástupného znaku ('?'), za kterým následuje klíčové slovo super následované jeho spodní hranicí: super A>.
funkce podřetězec java
Syntax: Typ sbírky super A>
Implementace:
Javaimport java.util.Arrays; import java.util.List; class WildcardDemo { public static void main(String[] args) { // Lower Bounded Integer List List<Integer> list1 = Arrays.asList(4 5 6 7); // Integer list object is being passed printOnlyIntegerClassorSuperClass(list1); // Number list List<Number> list2 = Arrays.asList(4 5 6 7); // Integer list object is being passed printOnlyIntegerClassorSuperClass(list2); } public static void printOnlyIntegerClassorSuperClass( List super Integer> list) { System.out.println(list); } }
Výstup
[4 5 6 7] [4 5 6 7]
Vysvětlení: Zde metoda printOnlyIntegerClassorSuperClass akceptuje pouze Integer nebo jeho nadtřídy (jako Number). Pokud se pokusíte předat seznam Double, zobrazí se chyba při kompilaci, protože Double není nadtřídou třídy Integer.
Poznámka: Použijte zástupný znak rozšíření, když chcete získat hodnoty ze struktury, a super zástupný znak, když do struktury vkládáte hodnoty. Při získávání a vkládání hodnot do struktury nepoužívejte zástupný znak. Můžete zadat horní hranici pro zástupný znak nebo můžete zadat dolní hranici, ale nemůžete zadat obojí.
3. Neohraničený zástupný znak
Tento typ zástupného znaku je určen pomocí zástupného znaku (?), například Seznam. Toto se nazývá seznam neznámých typů. Jsou užitečné v následujících případech -
dobový klíč
- Při psaní metody, kterou lze použít pomocí funkce poskytované ve třídě Object.
- Když kód používá metody v obecné třídě, která nezávisí na parametru typu
Implementace:
Javaimport java.util.Arrays; import java.util.List; class unboundedwildcardemo { public static void main(String[] args) { // Integer List List<Integer> list1 = Arrays.asList(1 2 3); // Double list List<Double> list2 = Arrays.asList(1.1 2.2 3.3); printlist(list1); printlist(list2); } private static void printlist(List> list) { System.out.println(list); } }
Výstup
[1 2 3] [1.1 2.2 3.3]