Alapok
Generikus osztályok, generikus metódusok és korlátozott típusok
Alapok
A generics compile-time típusbiztonságot ad, csökkenti a castolást, és újrafelhasználható API-kat tesz lehetővé.
1. Definíció
A generics a Java típusrendszerének olyan kiterjesztése, amely lehetővé teszi, hogy egy osztály vagy metódus több típusra is biztonságosan működjön. Interjún itt azt nézik, hogy érted-e: a típusinformáció főleg fordítási időben segít, és nem csak “szebb szintaxisról” van szó. A téma a kollekciókhoz, API-tervezéshez és type erasure-höz kapcsolódik. Ha tudsz generikus osztályt, generikus metódust és bounded type paramétert magabiztosan használni, az már erős alap.
2. Alapfogalmak
| Fogalom | Jelentés | Miért fontos |
|---|---|---|
class Box<T> |
Generikus osztály | A típusparamétert az objektum használatakor adod meg. |
<T> T identity(T value) |
Generikus metódus | A típusparaméter a metódusra lokális. |
<T extends Number> |
Felső korlát | A típus csak Number vagy annak leszármazottja lehet. |
| Raw type | Régi, generics nélküli használat | Típusbiztonságot vesztesz és warningot kapsz. |
| Type inference | A fordító következteti a típust | Rövidebb, de néha explicit típus kell az olvashatóság miatt. |
- A generikus osztály állapotot és viselkedést is típusparaméterhez köthet, például
Repository<T>vagyBox<T>. - A generikus metódus nem feltétlenül igényel generikus osztályt; utility jellegű kódnál ez nagyon gyakori.
- A bounded type paraméterrel korlátozhatod, milyen műveletek legyenek elérhetők a típuson.
- A raw type kompatibilitási okból létezik, de modern kódban inkább kerülendő.
3. Gyakorlati használat
A(z) Alapok 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.
- API-tervezésnél használj generics-et, ha a típuskapcsolat fontos a hívó számára. Jó példa erre a
List<T>vagyOptional<T>. - Ha egy utility metódus csak bejövő értéket kap és ugyanazt a típust adja vissza, általában generikus metódus a jó választás.
- Boundot akkor adj, ha a megengedett műveletekhez kell: például
sum(List<? extends Number>)vagy<T extends Comparable<T>>. - Interjún külön említsd meg, hogy generics célja a castok visszaszorítása és a compile-time hibaészlelés.
4. Kód példák
Egyszerű példa
public class Box<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
public static void main(String[] args) {
Box<String> box = new Box<>();
box.set("hello");
String text = box.get();
System.out.println(text.toUpperCase());
}
}
Haladó példa
import java.util.List;
public class GenericMethods {
public static <T> T first(List<T> items) {
if (items.isEmpty()) {
throw new IllegalArgumentException("List is empty");
}
return items.get(0);
}
public static <T extends Number> double sum(List<T> numbers) {
double total = 0;
for (T number : numbers) {
total += number.doubleValue();
}
return total;
}
}
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 |
|---|---|---|
| Generikus API | Erős típusbiztonság és kevesebb cast | A szignatúrák elsőre bonyolultabbnak tűnhetnek |
| Bounded type paraméter | Expresszíven leírható a szerződés | Túl sok bound rontja az olvashatóságot |
| Type inference | Kevesebb boilerplate | Néha félreérthető vagy rosszul olvasható lehet |
6. Gyakori hibák
- ❌ Rossz: Raw type-ot használsz:
List list = new ArrayList();✅ Helyes: Használj paraméterezett típust:List<String> list = new ArrayList<>(); - ❌ Rossz: Mindenhol
Object-et használsz generics helyett. ✅ Helyes: Fejezd ki a valódi típuskényszert generics-szel. - ❌ Rossz: Nem adsz boundot, pedig a kód numerikus műveleteket végez.
✅ Helyes: Korlátozd a típust például
T extends Numberformában.
7. Senior szintű meglátások
Senior nézőpontból a generics nem csak nyelvi feature, hanem API design eszköz. A jó generikus API megmutatja, hogy milyen típuskapcsolat érvényes a bemenet és a kimenet között.
Interjús follow-up: mikor jobb egy generikus metódus, mint egy generikus osztály? Általában akkor, ha a típuskapcsolat csak egyetlen művelethez kell, nem teljes objektuméletciklushoz.
Másik fontos szempont a hibaüzenetek minősége. A túlkomplikált generikus hierarchia lehet, hogy “okos”, de a fejlesztői élményt és a karbantarthatóságot rontja.
Tipikus follow-up interjúkérdések:
- Hogyan magyaráznád el röviden a(z) Alapok témát egy junior fejlesztőnek?
- Milyen trade-offot látsz a(z) Alapok 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 |
|---|---|
| type parameter | Olyan helyettesítő típus, mint a T, E, K, V. |
| raw type | Generics nélküli régi használat, pl. List. |
| bounded type | Olyan típusparaméter, amely korlátozva van, pl. T extends Number. |
| type inference | A fordító automatikusan kitalálja a típust. |
| compile-time safety | A típushibák már fordításkor kiderülnek. |
9. Gyorsreferencia
class Box<T>= generikus osztály.<T> T method(T value)= generikus metódus.<T extends Number>= felső korlát.- Raw type kerülendő modern kódban.
- Generics fő nyeresége: kevesebb cast, több típusbiztonság.
Ha interjún elakadsz, a(z) Alapok 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