Portál AbcLinuxu, 21. července 2025 17:29


Dotaz: Java-ArrayList bez typového parametru

13.6.2018 10:30 Elka
Java-ArrayList bez typového parametru
Přečteno: 1890×
Odpovědět | Admin

Pokud mám nějaké dvě nesouvisející třídy A,B a udělám toto:

ArrayList list=new ArrayList();

list.add(new B());

Jak je možné, že mi to projde a bude fungovat, když jsem v konstruktoru toho ArrayListu zadala typový parametr A?

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.6.2018 10:56 rtfm
Rozbalit Rozbalit vše Re: Java-ArrayList bez typového parametru
Odpovědět | | Sbalit | Link | Blokovat | Admin
https://docs.oracle.com/javase/tutorial/java/generics/erasure.html

ArrayList<X> je stále to samé jako ArrayList, akorát si tam kompilátor při vybírání hodnot z něj domyslí typecast Object -> X . Co neprojde je naplnit ArrayList hodnotama typu A a pokusit se z něj vybrat B. To spadne za běhu s výjimkou.
13.6.2018 11:21 Elka
Rozbalit Rozbalit vše Re: Java-ArrayList bez typového parametru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Omlouvám se, ale špatně jsem to napsala. U toho ArrayListu jsem měla na straně konstruktoru <A>, omylem se to však interpretovalo jako tag <A> pro web...
13.6.2018 12:03 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: Java-ArrayList bez typového parametru
Protože tohle udělá syrový list (bez ohledu na typový parametr na pravé straně):
List l = new ArrayList<A>();
zatímco vy chcete asi toto:
List<A> l = new ArrayList<>();
což je ekvivalent tohoto:
List<A> l = new ArrayList<A>();
Jinými slovy jste přidávala do syrového listu, měla byste dostat varování. Pokud máte javu 9 (nebo 10) můžete pro rychlé testování (nejen) těchto věcí použít jshell, vypadá to pak nějak takto (všimněte si, že dostáváte varování v případě A i B):
jshell> class A extends Object {}
|  created class A

jshell> class B extends Object {}
|  created class B

jshell> List l = new ArrayList<A>();
l ==> []

jshell> l.add(new A());
|  Warning:
|  unchecked call to add(E) as a member of the raw type java.util.List
|  l.add(new A());
|  ^------------^
$4 ==> true

jshell> l.add(new B());
|  Warning:
|  unchecked call to add(E) as a member of the raw type java.util.List
|  l.add(new B());
|  ^------------^
$5 ==> true

-- OldFrog

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.