2011-11-18 9 views
8

Una de las clases necesita almacenar clases de acuerdo con sus superclases. Para ese fin, estoy usando un HashMap, donde las claves son las superclases, y valoro una lista de sus clases ampliadas. Así que parece que:HashMap <Class<?>, lista <Class<?> >>: especifique que las clases de las listas extienden las claves '

HashMap<Class<?>, List<Class<?>>> 

Me gustaría saber si había una notación que me permite ser más precisos, algo así como:

HashMap<Class<T>, List<Class<? extends T>>> 

lo he intentado y, por supuesto , no funciona: T no se puede resolver. ¿Hay una sintaxis que me permita hacer eso? Gracias de antemano por tu ayuda.

Respuesta

8

Puede hacerlo con los métodos de acceso.

// only accessed by methods which check the keys and values are the right type. 
final Map<Class, List<Class>> map = new LinkedHashMap<Class, List<Class>>(); 

public <T, S extends T> void add(Class<T> key, Class<S> value) { 
    List<Class> list = map.get(key); 
    if (list == null) 
     map.put(key, list = new ArrayList<Class>()); 
    list.add(value); 
} 

public <T, S extends T> List<Class<S>>get(Class<T> key) { 
    return (List<Class<S>>) map.get(key); 
} 

public <T, S extends T> boolean contains(Class<T> key, Class<S> value) { 
    List<Class> list = map.get(key); 
    if (list == null) return false; 
    return list.contains(value); 
} 

public static void main(String... args) { 
    Main m = new Main(); 
    m.add(Number.class, Integer.class); // compiles 
    m.add(Number.class, String.class); // does not compile. 
} 
+2

+1. Sin embargo, tenga en cuenta que m.add (Number.class, Number.class); también compila. –

+0

Tiene razón, 'extends' no tiene que ser una subclase estricta en este contexto. –

+0

¿Y cómo codificarías a los captadores con esta forma de hacer las cosas? – Raveline

1

Algo así como:

class MyMap<T extends Class<?>> extends HashMap<T, List<T>> { 

} 

no va a resolver por completo el problema. Puedes ver que en entradas individuales en el mapa no puede variar.

Cuestiones relacionadas