2012-07-16 11 views
8

Tengo un Map cuyas claves son del tipo genérico Key<T>, y los valores son del tipo List<T>. Si la clave es una instancia de Key<String>, el valor debe ser List<String>, y la misma regla se aplica a cualquier otro par clave-valor. He intentado lo siguiente pero no se compila:¿Cómo declarar un mapa con genéricos variables?

Map<T, List<T>> map; 

En la actualidad tengo que declarar que con los genéricos "parciales":

Map<Object, List> map; 

Sé que esto es malo, pero actualmente no tengo ninguna opción mejor . ¿Es posible usar medicamentos genéricos en esta situación?

ACTUALIZACIÓN

Tal vez no expresara mi problema con claridad. Quiero un mapa que es capaz de:

map.put(new Key<String>(), new ArrayList<String>()); 
map.put(new Key<Integer>(), new ArrayList<Integer>()); 

Y el siguiente código no debe compilar:

map.put(new Key<String>(), new ArrayList<Integer>()); 

La clave y el valor siempre deben tener el mismo tipo genérico, mientras que el tipo genérico puede ser cualquiera, y obviamente extender un mapa no cumple con mis requisitos.

+0

espacio no debería ser el problema. Es probable la forma en que se usa. OP necesita mostrar más código para corregir. – Nishant

+0

¿Está utilizando claves de tipo 'T', o teclas de tipo' Key '? –

+0

Con su escenario real, debe usar la encapsulación para resolver su problema, como Nishant y Geoff declaran en sus respuestas, simplemente adaptarlo a su código real. –

Respuesta

7

No conozco ninguna biblioteca existente que haga precisamente esto, pero no es demasiado difícil de implementar usted mismo. He hecho algo similar algunas veces en el pasado. No puede usar la interfaz estándar de Map pero puede usar un mapa hash dentro para implementar su clase. Para empezar, podría ser algo como esto:

public class KeyMap { 
    public static class Key<T> { } 

    private final HashMap<Object,List<?>> values = new HashMap<Object,List<?>>(); 

    public <T> void put(Key<T> k, List<T> v) { 
    values.put(k, v); 
    } 

    public <T> List<T> get(Key<T> k) { 
    return (List<T>)values.get(k); 
    } 

    public static void main(String[] args) { 
    KeyMap a = new KeyMap(); 
    a.put(new Key<String>(), new ArrayList<String>()); 
    a.get(new Key<Integer>()); 
    } 
} 
+0

En realidad está envolviendo mi 'Map > map' en otra clase.Parece que un mapa simple no puede cumplir con mis requisitos, por lo que esta puede ser la última opción. ¡Gracias! –

4

Esto es lo que quiere:

public class Test<T> extends HashMap<T, List<T>> 
{ 
} 

Si no desea un HashMap como la superclase luego cambiarlo a cualquier clase concreta que desea.

+0

Consulte mi actualización. –

+0

He cambiado mi respuesta. – Brad

+0

Pero, ¿cómo podría usar solo una instancia 'Test' para almacenar mis datos? –

Cuestiones relacionadas