În Java Generics, caracterele metalice sunt folosite atunci când nu cunoașteți tipul exact. Vă permit să scrieți cod flexibil și reutilizabil. Wildcardul este reprezentat de un ? (semnul de întrebare). Wildcardurile sunt utilizate în principal în parametrii metodei pentru a accepta diferite tipuri generice în siguranță.
Tipuri de wildcards în Java
1. Caractere metalice delimitate superioare
Aceste metacaractere pot fi folosite atunci când doriți să relaxați restricțiile asupra unei variabile. De exemplu, să presupunem că doriți să scrieți o metodă care funcționează pe Listă< Integer >Listă< Double >și Listă< Number >puteți face acest lucru folosind un wildcard delimitat superior.
Pentru a declara un wildcard cu limite superioare, utilizați caracterul wildcard ('?') urmat de cuvântul cheie extins urmat de limita sa superioară.
public static void add(Lista extends Number>listă)
ce este o stivă în java
Implementare:
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; } }
Ieșire
Total sum is:22.0 Total sum is:15.299999999999999
Explicaţie: În programul de mai sus, list1 conține valori întregi și list2 conține valori duble. Ambele sunt trecute la metoda sum care folosește un wildcard extends Number>. Aceasta înseamnă că poate accepta orice listă de tip care este o subclasă de Număr, cum ar fi Integer sau Double.
2. Wildcards delimitate inferioară
Acesta este exprimat folosind caracterul wildcard ('?') urmat de cuvântul cheie super urmat de limita sa inferioară: super A>.
sortare selecție în java
Sintaxă: Tipul de colecție super A>
Implementare:
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); } }
Ieșire
[4 5 6 7] [4 5 6 7]
Explicaţie: Aici metoda printOnlyIntegerClassorSuperClass acceptă numai Integer sau superclasele sale (cum ar fi Number). Dacă încercați să treceți o listă de Double, aceasta dă o eroare de compilare, deoarece Double nu este o superclasă de Integer.
Nota: Folosiți caracterul joker extins când doriți să obțineți valori dintr-o structură și un caracter joker super când introduceți valori într-o structură. Nu utilizați wildcard atunci când obțineți și puneți valori într-o structură. Puteți specifica o limită superioară pentru un wildcard sau puteți specifica o limită inferioară, dar nu le puteți specifica pe ambele.
3. Wildcard nelimitat
Acest tip de wildcard este specificat folosind caracterul wildcard (?), de exemplu Listă. Aceasta se numește o listă de tipuri necunoscute. Acestea sunt utile în următoarele cazuri -
formula mason
- Când scrieți o metodă care poate fi folosită folosind funcționalitatea oferită în clasa Object.
- Când codul folosește metode din clasa generică care nu depinde de parametrul tip
Implementare:
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); } }
Ieșire
[1 2 3] [1.1 2.2 3.3]