Podla mojho nazoru taketo obmezenie nie je mozne stanovit. Rovnako si
myslim, ze nie je mozne napisat implementaciu, ktora by splnala Vase
poziadavky a zaroven implementovala iba metody ktore definuje rozhranie
Map. Podla toho ako ja chapem Vase poziadavky, generics a definiciu
rozhrania Map snazite sa uskutocnit nieco co v principe nie je mozne.
Zda sa, ze pokial neustupite od svojich poziadaviek tak sa nevyhnete
implementacii vlastneho typu, ktory bude umoznovat stanovit Vami
pozadovane obmedzenia. V prilohe je ukazka ako by mohla implementacia
taketo typu vyzerat.
Ales
Tomáš Záluský wrote:
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ý
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public final class MyMap
{
private final Map< Class, List > _map;
public MyMap()
{
super();
_map = new HashMap< Class, List >();
}
public < T extends Number > List< T > put( Class< T > pKey, List< T >
pValue )
{
_map.put( pKey, pValue );
return pValue;
}
public static void main( String[] args )
{
List< Integer > listOfIntegers = new ArrayList< Integer >();
List< BigDecimal > listOfBigDecimals = new ArrayList< BigDecimal >();
MyMap myMap = new MyMap();
myMap.put( Integer.class, listOfIntegers );
myMap.put( BigDecimal.class, listOfBigDecimals );
// NOTE: Compilation errors are commented
//myMap.put( Integer.class, listOfBigDecimals );
//myMap.put( BigDecimal.class, listOfIntegers );
}
}