Rád bych poděkoval všem, kdo odpověděli na můj příspěvek o mapě s
generickými entries. Omlouvám se, že odpovídám až po 14 dnech, ale
nezapomněl jsem na to. Problém jsem skutečně formuloval příliš striktně
a všechny požadavky - jak psal Aleš na Javě - splnit nelze. Příčina,
proč objekt nemůže implementovat interface Map, je v tom, že metoda
Map.put(K,V) už nelze "omezit", a to jak v signatuře (předělat na <T>
void put(Class<T>,.....)), tak v samotné možnosti ji zavolat (throw
UnsupportedOperationException() by nikam nevedlo). Jedinou smysluplnou
činností vykonanou v těle této metody by byla delegace na metodu <T>
void myPut(Class<T>,.....), která zas ovšem nepatří do Map. To už pak
vede na náhradu dědění kompozicí, což byly obě ukázky z Vašich rad.
Nakonec jsem se pro tuto cestu rozhodl, protože se mezitím ukázala
potřeba dalšího rozšíření API směrem pryč od Mapy, takže kompozice vyšla
jako mnohem pružnější řešení. Pomohly také některé linky na
forum.java.sun.com v sekci Generics.

Zdravím
Tomáš Záluský


-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
Behalf Of Tomáš Záluský
Sent: Friday, October 07, 2005 1:23 PM
To: [email protected]
Subject: Mapa s generickými entries


Zdravím konferenci,
prosím, kdo by mě uměl nakopnout v následujícím problému: postupně si
osvojuji generické třídy v Javě 5.0 a narazil jsem na potřebu (resp.
bylo by hezké, kdyby to tak fungovalo) pomocí generických tříd stanovit
omezení, aby prvky mapy (java.util.Map) obsahovaly v klíči třídu
(Class<T>) a v hodnotě seznam parametrizovaný stejným typem (tj.
List<T>) ?. Typ T není pro všechny entries stejný, ale v rámci entry jde
vždy o tentýž typ. 

Pak by mělo jít napsat:
List<BigDecimal> lb = new ArrayList<BigDecimal>;
lb.add(new BigDecimal("100"));
lb.add(new BigDecimal("200"));
map.put(BigDecimal.class,lb);
List<Integer> li = new ArrayList<Integer>;
li.add(1);
li.add(2);
map.put(Integer.class,li);

ale nesmělo by jít:
map.put(BigDecimal.class,li);

Podle mne to nějak vede na vytvoření generické třídy ve smyslu zápisu 
class MyMapEntry<T> implements Map.Entry<Class<T>,List<T>>
ale prakticky nevím, jak dál.

Abych problém specifikoval úplně, tak ještě dodávám, že typ T je shora
omezený konkrétní pevně danou třídou. Např. pro ukázku uvedenou výše by
to byla třída Number a deklarace by vypadala MyMapEntry<T extends
Number> atd. Asi to nějak povede na vlastní mapu, ale nedaří se mi to
poskládat, s kolekcemi v Javě jinak (z 1.4) zkušenosti mám. Nebráním se
ani řešení odlišnému od MyMapEntry, ale rád bych zachoval interface Map.
Díky předem!

Tomáš Záluský




Odpovedet emailem