Középhaladó Olvasási idő: ~5 perc

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> vagy Box<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> vagy Optional<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 Number formá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