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

Ha, to je zajímavý problém, takový už tu dlouho nebyl :-)
Udělat to přímo parametrizováním Map asi nepůjde.
Ale dokážu to udělat parametrizovatelnou metodou:


import java.util.*;
import java.math.BigDecimal;

public class Typy {

    static class MyMap {
        private Map<Class,List> map = new HashMap<Class,List>();

        public <T extends Number> void put(Class<T> key,List<T> value) {
            map.put(key,value);
        }
    }

    public static void main(String[] args) {
        MyMap map = new MyMap();

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

        map.put(BigDecimal.class,li); //nejde !
    }
}

Když to zkusíte překompilovat, tak první dvě možnosti vložení projdou,
a třetí to zachytí jako špatnou:

$javac Typy.java
Typy.java:26: <T>put(java.lang.Class<T>,java.util.List<T>) in Typy.MyMap cannot be applied to (java.lang.Class<java.math.BigDecimal>,java.util.List<java.lang.Integer>)
        map.put(BigDecimal.class,li); //nejde !
           ^
1 error


Makub
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Supercomputing Center Brno             Martin Kuba
Institute of Computer Science    email: [EMAIL PROTECTED]
Masaryk University             http://www.ics.muni.cz/~makub/
Botanicka 68a, 60200 Brno, CZ     mobil: +420-603-533775
--------------------------------------------------------------

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Odpovedet emailem