1 32 package net.sf.retrotranslator.runtime.java.util; 33 34 import java.io.Serializable ; 35 import java.util.*; 36 37 40 public class EnumMap_<K extends Enum <K>, V> extends TreeMap<K, V> { 41 42 private static final long serialVersionUID = 3267103726949236459L; 43 44 private final Class <K> keyType; 45 46 public EnumMap_(Class <K> keyType) { 47 super(new EnumComparator()); 48 if (!keyType.isEnum()) { 49 throw new NullPointerException (); 50 } 51 this.keyType = keyType; 52 } 53 54 public EnumMap_(EnumMap_<K, ? extends V> map) { 55 super(map); 56 this.keyType = map.keyType; 57 } 58 59 public EnumMap_(Map<K, ? extends V> map) { 60 this(getKeyType(map)); 61 putAll(map); 62 } 63 64 public V put(K key, V value) { 65 Class <? extends Enum > aClass = key.getClass(); 66 if (aClass != keyType && aClass.getSuperclass() != keyType) { 67 throw new ClassCastException (aClass.getName()); 68 } 69 return super.put(key, value); 70 } 71 72 public void putAll(Map<? extends K, ? extends V> map) { 73 for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) { 74 put(entry.getKey(), entry.getValue()); 75 } 76 } 77 78 public EnumMap_<K, V> clone() { 79 return (EnumMap_<K, V>) super.clone(); 80 } 81 82 private static <K extends Enum <K>, V> Class <K> getKeyType(Map<K, ? extends V> map) { 83 if (map instanceof EnumMap_) { 84 return ((EnumMap_<K, ? extends V>) map).keyType; 85 } 86 if (map.isEmpty()) { 87 throw new IllegalArgumentException (); 88 } 89 return map.keySet().iterator().next().getDeclaringClass(); 90 } 91 92 private static class EnumComparator implements Comparator, Serializable { 93 public int compare(Object o1, Object o2) { 94 if (o1 instanceof Enum ) { 95 return o2 instanceof Enum ? ((Enum ) o1).ordinal() - ((Enum ) o2).ordinal() : 1; 96 } else { 97 return o2 instanceof Enum ? -1 : 0; 98 } 99 } 100 } 101 102 } 103 | Popular Tags |