Jelenlegi hely

15.1. Kapcsolatok az általános típusok között

Valószínűleg azt várjuk, hogy a Stack2<Object> a szülő típusa a Stack2<String>-nek, mert az Object szülője a String-nek. A valóságban nem létezik ilyen kapcsolat az általános típusok példányai között. A szülő-gyermek kapcsolat hiánya az általános típus példányai között nehézkessé teheti a többalakú (polimorf) eljárások megírását.

Tegyük fel, hogy szeretnénk megírni egy eljárást, ami kiírja egy gyűjteményben tárolt objektumokat az objektumok típusától függetlenül a konzolra.

public void printAll(Collection<Object> c) {
    for (Object o : c) {
        System.out.println(o);
    }
}

Választhatnánk, hogy létrehozunk egy String listát és ezt a metódust használjuk az összes String kiíratására:

List<String> list = new ArrayList<String>();
...
printall(list);   //error

Ha ezt használjuk, akkor észre fogjuk venni, hogy az utolsó sor fordítási hibát ad. Mivel az ArrayList<String> nem leszármazott típusa a Collection<Object>-nek, ezért nem adható át, mint paraméter a kiíratási eljárásnak annak ellenére, hogy a két típus ugyanannak az általános típusnak a leszármazottai, rokon öröklött típus paraméterekkel. Más részről az öröklés miatt kapcsolatban álló általános típusok ugyanazzal a típus paraméterrel kompatibilisek:

public void printAll(Collection<Object> c) {
    for (Object o : c) {
        System.out.println(o);
    }
}
List<Object> list = new ArrayList<Object>();
...
printall(list);   //this works

A List<Object> kompatibilis a Collection<Object>-el, mert a két típus példánya egy általános szülőtípusnak és annak leszármazott típusának, és a példányok ugyanahhoz a típus paraméterhez tartoznak, konkrétan az Object-hez.