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 );
    }
}

Odpovedet emailem