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ý
