V Java Generics sa zástupné znaky používajú, keď nepoznáte presný typ. Umožňujú vám písať flexibilný a opakovane použiteľný kód. Zástupný znak je reprezentovaný ? (otáznik). Zástupné znaky sa používajú hlavne v parametroch metódy na bezpečné akceptovanie rôznych generických typov.
Typy zástupných znakov v jazyku Java
1. Horné ohraničené zástupné znaky
Tieto zástupné znaky možno použiť, keď chcete uvoľniť obmedzenia premennej. Povedzme napríklad, že chcete napísať metódu, ktorá funguje na zozname< Integer >Zoznam< Double >a Zoznam< Number >môžete to urobiť pomocou zástupného znaku s hornou hranicou.
Ak chcete deklarovať zástupný znak s hornou hranicou, použite zástupný znak ('?'), za ktorým nasleduje kľúčové slovo extends, za ktorým nasleduje jeho horná hranica.
public static void add(Zoznam extends Number>zoznam)
abs c kód
Implementácia:
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
Vysvetlenie: Vo vyššie uvedenom programe list1 obsahuje celočíselné hodnoty a zoznam2 obsahuje hodnoty Double. Obidve sa prenesú do metódy súčtu, ktorá používa zástupný znak extends Number>. To znamená, že môže akceptovať akýkoľvek zoznam typu, ktorý je podtriedou čísla, ako je Integer alebo Double.
2. Nižšie ohraničené zástupné znaky
Vyjadruje sa pomocou zástupného znaku ('?'), za ktorým nasleduje super kľúčové slovo, za ktorým nasleduje jeho spodná hranica: super A>.
funkcia podreťazca java
Syntax: Typ kolekcie super A>
Implementácia:
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]
Vysvetlenie: Metóda printOnlyIntegerClassorSuperClass tu akceptuje iba celé číslo alebo jeho nadtriedy (ako Number). Ak sa pokúsite odovzdať zoznam Double, zobrazí sa chyba pri kompilácii, pretože Double nie je nadtriedou triedy Integer.
reťazec ti int
Poznámka: Použite rozšíriť zástupný znak, keď chcete získať hodnoty zo štruktúry, a super zástupný znak, keď vložíte hodnoty do štruktúry. Pri získavaní a vkladaní hodnôt do štruktúry nepoužívajte zástupný znak. Môžete zadať hornú hranicu pre zástupný znak alebo môžete zadať dolnú hranicu, ale nemôžete zadať oboje.
3. Neobmedzený zástupný znak
Tento typ zástupného znaku je špecifikovaný pomocou zástupného znaku (?), napríklad Zoznam. Toto sa nazýva zoznam neznámych typov. Sú užitočné v nasledujúcich prípadoch -
- Pri písaní metódy, ktorú možno použiť pomocou funkcionality poskytovanej v triede Object.
- Keď kód používa metódy vo generickej triede, ktorá nezávisí od parametra typu
Implementácia:
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]