Hirdetés

Új hozzászólás Aktív témák

  • floatr
    veterán

    Miért a helyes esetben a T-t hol deklaráltam?

    public class Raktar<T extends Termek> extends ArrayList<T> { }

    aha, akkor azt a különbséget már értem, hogy ha
    ArrayList<Termek> -ként hozom létre az osztályt, akkor ebbe mehet Termek, és Termek leszármazott, a másik tipusparaméteres esetben pedig a typus argumentumtól függ, hogy mi mehet bele, tehát
    RaktarV<T extends Termek> extends ArrayList<T> esetén ha olyat írok hogy
    RaktarV<Gyumolcs> = new ...
    akkor Csak Gyumolcs és annak leszármazottai mehetnek bele, de Termek mar nem, csak ugy ha a tipus-argumentum az Termek ->
    RaktarV<Termek> = new ...

    De azt továbbra sem értem, hogy ezt miért így kell szintaktikailag létrehozni :D Bár lehet ezen feleslegesen pörgök, jegyezzem meg 'oszt kész ^^

    Az új osztály definíciójánál az ősosztály paraméteres. Vagy konkretizálod, hogy mi a paraméter, vagy hagyod eredeti formájában. A paraméterre vonatkozó megszorítást (Termek) csak az éppen definiált osztálynál tehetsz. Ez a megszorítás annyit tesz, hogy a fordító csak olyan Raktar objektumot enged létrehozni, aminek a paramétere Termek típusú, vagy annak leszármazottja. Ha Gyumolcs paraméterrel hozod létre, akkor onnantól kezdve már nem adhatsz hozzá bármilyen Termek leszármazottat, csak ami a Gyumolcs-ből ered.

    Ha pl a Kifli is termék (de ugyebár nem Gyumolcs), akkor ez nem fog fordulni:

    new Raktar<Gyumolcs>().add(new Kifli());

    mert ez egy "gyümölcsraktár" példány, ahová kiflit nem lehet raktározni

    szerk.:
    a paraméteres leszármaztatásnál vagy az osztály definíciójakor szabod meg, hogy mi a paraméter, vagy az osztály is paraméteres lesz. Ha paraméteresen hagyod, akkor megmondhatod, hogy milyen ősosztályból lehet paraméter használni, amikor az osztályt létrehozod. A megszorítást meg azért az új osztálynál kell bevésni, mert arra vonatkozik a megszorításod, nem az ősosztályra.

Új hozzászólás Aktív témák