Portál AbcLinuxu, 13. července 2025 13:24
final EditText myEditText = (EditText)findViewById(R.id.myEditText);
Chápu že muselo dojít k přetypování z View na EditText protože findViewById vrací View a já potřebuju EditText. Kde se ale dá zjistit jaké typy jsou kompatibilní a lze je přetypovat ?
Dále mi neni jasný co je <String>
v tomto examplu :
final ArrayList<String> todoItems = new ArrayList<String>();
Díky za nakopnutí :)
Řešení dotazu:
test()
, o vraceném typu nic nevíte.
public Object test(int cislo) { if (cislo == 0) { return "nula"; } return 0; } String str = (String) test(0);V druhém případě jde o generika, novinku z Javy 5. Každopádně doporučuju sehnat nějakou učebnici Javy, dobrá je např. Učebnice jazyka Java od Pavla Herouta, novější vydáí už by měla zahrnovat i novinky v Javě 5.
Kde se ale dá zjistit jaké typy jsou kompatibilní a lze je přetypovat ?Přetypovat můžete co chcete na co chcete. Přetypování Vám ale "projde" jen v případě, že objekt je skutečně instancí dané třídy (nebo jejím potomkem). Pokud toto nebude splněno dostanete výjimku ClassCastException. To se týká přetypování objektů, přetypování primitivních typů je veskrze jiná věc.
Map map = (HashMap) new LinkedList();
OK, zdá se, že tohle chytne už překladač. Ale přeložíteMap map = (HashMap) new LinkedList();toto nepojde ani len skompilovat
Map m = (Map) new ArrayList();nebo
Map m = (HashMap) (Object) new ArrayList();a oboje podle očekávání vyhodí výjimku ClassCastException.
alebo predkom, co ale nema moc zmyselSmysl to má, pokud to třeba použijete v souvislosti s generiky (např. metodou
java.util.arrays.asList
).
LinkedList
na třídu HashMap
nepřetypujete, protože žádný objekt nemůže být zároveň typu HashMap
i LinkedList
. U rozhraní to možné je – můžete si vytvořit potomka ArrayList
, který bude zároveň typu Map
.
U toho konstruktoru je to sice vidět, že to přetypování je nesmysl, ale kompilátor zřejmě nezkoumá tenhle vyšší pohled. Pro kompilátor jsou to dva kroky – získání objektu typu ArrayList
(v tomto případě vytvořením nové instance) a v druhém kroku jeho přetypování. Když si místo toho představíte trochu jiný kód, ten už může normálně fungovat:
public ArrayList getArrayList() {…} Map m = (Map) getArrayList();
double
za předka int
).
Na druhou otázku také velmi zjednodušeně: jedná se o generiky a tento konkrétní zápis znamená, že v tom seznamu se mohou vykytovat pouze řetězce. Nic jiného tam nelze vložit a při čtení je automaticky deklarován typ String. Pozor na to, že generiky v Javě jsou zpracovávány jen na úrovní kompilátoru, ve výsledném kódu tam je deklarováno Object
a všude doplněno přetypování.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.