Java Genericsissä jokerimerkkejä käytetään, kun et tiedä tarkkaa tyyppiä. Niiden avulla voit kirjoittaa joustavaa ja uudelleen käytettävää koodia. Jokerimerkkiä edustaa ? (kysymysmerkki). Jokerimerkkejä käytetään pääasiassa menetelmäparametreissa erilaisten yleistyyppien hyväksymiseksi turvallisesti.
Jokerimerkkien tyypit Javassa
1. Ylärajalliset jokerimerkit
Näitä yleismerkkejä voidaan käyttää, kun haluat lieventää muuttujan rajoituksia. Oletetaan esimerkiksi, että haluat kirjoittaa menetelmän, joka toimii luettelossa< Integer >Lista< Double >ja Lista< Number >voit tehdä tämän käyttämällä ylärajattua jokerimerkkiä.
Jos haluat ilmoittaa ylärajallisen yleismerkin, käytä yleismerkkiä ('?'), jota seuraa extens-avainsana ja sen yläraja.
public static void add(List extends Number>lista)
Tarkista null javassa
Toteutus:
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; } }
Lähtö
Total sum is:22.0 Total sum is:15.299999999999999
Selitys: Yllä olevassa ohjelmassa lista1 sisältää kokonaislukuarvot ja lista2 kaksinkertaiset arvot. Molemmat välitetään summamenetelmälle, joka käyttää jokerimerkkiä extends Number>. Tämä tarkoittaa, että se voi hyväksyä minkä tahansa luettelon, joka on luvun alaluokka, kuten Kokonaisluku tai Double.
2. Alarajaiset jokerimerkit
Se ilmaistaan käyttämällä yleismerkkiä ('?'), jota seuraa super-avainsana ja sen alaraja: super A>.
java-kuplalajittelu
Syntaksi: Kokoelman tyyppi super A>
Toteutus:
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); } }
Lähtö
[4 5 6 7] [4 5 6 7]
Selitys: Tässä menetelmä printOnlyIntegerClassorSuperClass hyväksyy vain kokonaisluvun tai sen superluokat (kuten Number). Jos yrität välittää luettelon Double, se antaa käännösaikavirheen, koska Double ei ole kokonaislukujen superluokka.
java lambda esimerkki
Huomautus: Käytä laajennettua jokerimerkkiä, kun haluat saada arvot ulos rakenteesta, ja superjokerimerkkiä, kun lisäät arvoja rakenteeseen. Älä käytä jokerimerkkejä, kun hankit ja lisäät arvoja rakenteeseen. Voit määrittää jokerimerkille ylärajan tai voit määrittää alarajan, mutta et voi määrittää molempia.
3. Rajoittamaton jokerimerkki
Tämä jokerimerkkityyppi määritetään käyttämällä yleismerkkiä (?), esimerkiksi List. Tätä kutsutaan luetteloksi tuntemattomista tyypeistä. Ne ovat hyödyllisiä seuraavissa tapauksissa -
- Kun kirjoitetaan menetelmää, jota voidaan käyttää Object-luokassa tarjotuilla toiminnoilla.
- Kun koodi käyttää yleisen luokan menetelmiä, jotka eivät riipu tyyppiparametrista
Toteutus:
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); } }
Lähtö
[1 2 3] [1.1 2.2 3.3]