Wildcardok
Korlátlan wildcard, felső korlát, alsó korlát és PECS elv
Wildcardok
A wildcardok rugalmasabb generikus API-t adnak, ha típuscsaládok között kell együttműködni.
1. Definíció
A wildcard a generics egyik eszköze arra, hogy ne egyetlen konkrét típusparaméterhez ragaszkodj, hanem egy típuscsaládot fogadj el. Interjún tipikusan azt kérdezik, hogy mikor használj <?>, <? extends T> vagy <? super T> formát.
Ez a téma ott fontos, ahol producer-consumer szemlélet, PECS elv és kollekciók közötti együttműködés jelenik meg. A lényeg nem a jelölés bemagolása, hanem annak megértése, hogy mit lehet biztonságosan olvasni vagy írni.
2. Alapfogalmak
| Fogalom | Jelentés | Miért fontos |
|---|---|---|
<?> |
Ismeretlen típusú lista | Olvasni lehet Object-ként, írni gyakorlatilag nem. |
<? extends Number> |
Felső korlátos wildcard | Olvasásra jó, mert minden elem legalább Number. |
<? super Integer> |
Alsó korlátos wildcard | Írásra jó Integer típusú értékekkel. |
| PECS | Producer Extends, Consumer Super | Gyors döntési szabály wildcard választáshoz. |
| Invariance | A List<Integer> nem List<Number> |
Ezért kell wildcard a rugalmassághoz. |
- A generikus típusok invariánsak: attól, hogy
Integerleszármazottja aNumber-nek, még aList<Integer>nem leszList<Number>. - A
<? extends T>akkor jó, ha főleg olvasol a struktúrából; biztonságosan tudodT-ként kezelni az elemeket. - A
<? super T>akkor jó, ha főleg írsz bele;Tés annak altípusai biztonságosan betehetők. - Az unbounded wildcard
<?>akkor praktikus, ha a konkrét típus nem fontos, csak a kollekció mint absztrakció.
3. Gyakorlati használat
A(z) Wildcardok témában a legfontosabb gyakorlati kérdés mindig az, hogy milyen use-case-re választasz eszközt. A jó interjúválasz itt nem csak azt mondja meg, mit lehet csinálni, hanem azt is, mikor érdemes és mikor nem.
- Használj
<? extends T>-t olyan metódusparaméterhez, ami adatforrásként viselkedik, például másoló vagy összegző metódusban. - Használj
<? super T>-t olyan célkollekciónál, ahováTértékeket teszel. - Ha csak a méret, iteráció vagy logolás érdekel, akkor
Collection<?>általában jobb, mint a nyers típus. - Interjún érdemes kimondani: wildcard inkább API-határon jellemző, osztályszintű tárolt mezőként ritkábban ideális.
4. Kód példák
Egyszerű példa
import java.util.List;
public class WildcardRead {
public static double sum(List<? extends Number> numbers) {
double total = 0;
for (Number number : numbers) {
total += number.doubleValue();
}
return total;
}
}
Haladó példa
import java.util.ArrayList;
import java.util.List;
public class WildcardCopy {
public static <T> void copy(List<? extends T> source, List<? super T> target) {
for (T item : source) {
target.add(item);
}
}
public static void main(String[] args) {
List<Integer> source = List.of(1, 2, 3);
List<Number> target = new ArrayList<>();
copy(source, target);
System.out.println(target);
}
}
A kódpéldák interjún azért hasznosak, mert megmutatják, hogy a fogalmi szintű tudást le tudod fordítani konkrét API-használatra. Ha röviden el tudod magyarázni, miért így írod a példát, az általában többet ér, mint egy túlbonyolított demo.
5. Trade-offok
| Szempont | Előny | Hátrány |
|---|---|---|
| Wildcardos API | Rugalmasabb metódusszignatúra | Nehezebb elsőre olvasni |
extends |
Biztonságos olvasás felső korláttal | Nem tudsz általánosan írni bele |
super |
Biztonságos írás consumer szerepben | Olvasáskor csak Object-et kapsz vissza biztosan |
6. Gyakori hibák
- ❌ Rossz:
List<Integer>-t próbálsz átadniList<Number>paraméternek. ✅ Helyes: Használj wildcardot, példáulList<? extends Number>. - ❌ Rossz:
List<? extends Number>-be elemeket akarszadd-olni. ✅ Helyes: Olvasásra használd, íráshoz válassz? super-t vagy konkrét típust. - ❌ Rossz: Wildcardot tárolsz mezőként ott is, ahol a konkrét típus ismert. ✅ Helyes: API-határon wildcard, domain modellen belül inkább konkrét vagy típusparaméterezett típus.
7. Senior szintű meglátások
Senior szinten a wildcardokat nem izolált szabályként, hanem API ergonomia szempontjából értékeljük. A kérdés az, hogy a hívó mennyire kényelmesen tudja használni a metódust.
Gyakori follow-up: miért nem jó mindenhová ? extends Object? Mert nem ad valódi többletet, viszont félreviszi az olvasót és korlátozhatja az írást.
PECS jó emlékeztető, de nem helyettesíti a gondolkodást. Mindig azt nézd, hogy a paraméter producerként vagy consumerként viselkedik-e.
Tipikus follow-up interjúkérdések:
- Hogyan magyaráznád el röviden a(z) Wildcardok témát egy junior fejlesztőnek?
- Milyen trade-offot látsz a(z) Wildcardok kapcsán valós projektben?
- Milyen tipikus production hibát tudsz ehhez a témához kötni?
8. Szószedet
| Kifejezés | Jelentés |
|---|---|
| wildcard | Ismeretlen típushelyettesítő, például ?. |
| upper bound | Felső korlát, pl. ? extends Number. |
| lower bound | Alsó korlát, pl. ? super Integer. |
| PECS | Producer Extends, Consumer Super. |
| invariance | A generikus típusok nem kovariánsak alapból. |
9. Gyorsreferencia
<?>= ismeretlen típus, főleg olvasás/meta műveletek.<? extends T>= producer, olvasáshoz.<? super T>= consumer, íráshoz.List<Integer>nemList<Number>.- PECS = gyors döntési szabály.
Ha interjún elakadsz, a(z) Wildcardok témánál mindig térj vissza a három alapelvhez: pontos definíció, tipikus use-case, és a legfontosabb trade-off vagy hiba.
🎮 Játékok
8 kérdés