[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