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 jdevž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
--------------------------------------------------------------
smime.p7s
Description: S/MIME Cryptographic Signature
