[Java lista] egy kezdo generics kerdes
Székely István
iszekely at delfin.unideb.hu
2006. Dec. 14., Cs, 03:21:37 CET
Szia!
Cpt wrote:
> illetve mégsem :|
> mert akkor a későbbi két értékadás romlik el.
>
>> köszi!
>> Ez hiányzott.
>>
>>> A deklarálásnál a
>>> Collection<Number> numbers = new ArrayList<Number>()
>>>
>>> formát használd!
>>> A <? extends Number> forma a metódusoknál kell.
>>>
>>>> miért hibás az alábbi kód második sora?
>>>>
>>>> Collection<? extends Number> numbers = new
>>>> ArrayList<Number>()
Eloszor is, a kerdojeles forma nem csak metodus parameterekent hasznalhato.
Viszont a kerdojel azt eredmenyezi, hogy nem tudsz hozzaadni elemeket
(vagyis null-t tudsz, de azt meg minek :)). Nagyjabol ez egy read-only
kollekcio, amit tobb ertelme van metodus parameterekent hasznalni, mint csak
ugy a hecc kedveert.
List<? extends Number> list = new ArrayList<Integer>();
list.add(null);
// compile error
//list.add(new Integer(1));
A masodik dolog, hogy polimorfizmus csak az alaptipus eseten megengedett, a
parameter tipus eseten nem. A "type erasure" miatt csak ilyen korlatozasok
mellett lehetsz biztos abban, hogy a vart tipust kapod.
Szoval azt nem mondhatod, hogy
ArrayList<Number> l = new ArrayList<Integer>();
Viszont mondhatod, hogy
List<Number> l2 = new ArrayList<Number>();
Ekkor hozza tudsz adni barmilyen Number leszarmazottat, kivenni viszont
mindent csak Number-kent lehet. Ha neked megis a leszarmazott kell, akkor
marad a jo oreg tipuskonverzio, pont ami miatt ezt az egesz generikus dolgot
bevezettek a Javaba (marmint, hogy ne kelljen konvertalni).
l2.add(new Integer(1));
l2.add(new Double(3.14159265358));
Integer n = (Integer) l2.get(0);
Ezek a generikusok mar csak igy mukodnek Javaban. :(
Remelem, ez egy kicsit vilagosabba teszi, mik a lehetosegeid.
Stivi
További információk a(z) Javalist levelezőlistáról