Aunque se han dado respuestas correctas, hay una alternativa más que aún no se ha señalado. Básicamente, los campos y métodos no son los únicos lugares donde puede vivir la información de tipo genérico: la declaración de superclase también contiene esta información.
Esto significa que si su mapa es en realidad un sub-tipo como:
class MyStringMap extends HashMap<String,String> { }
entonces es posible averiguar los parámetros de tipo genérico que se utilizaron, llamando 'getGenericSuperclass' (en 'instance.getClass() '), y luego accediendo a los parámetros de tipo reales asignados. Se vuelve bastante complicado ya que uno debe atravesar la jerarquía de tipos para asegurarse de que los parámetros se vinculen correctamente a Map (pueden tener alias, etc.), pero se puede hacer.Y esta es la forma "super token" se utiliza para pasar declaración genérica como:
new TypeToken<Map<String, Double>>() { }
que es utilizado por muchos marcos de Java (Jersey, Guice, Jackson y muchos más)
problema aquí es que, aunque esto permite determinar los tipos nominales de una instancia, solo funciona si hay una subclase no genérica real de tipo genérico, y no conozco una forma de hacer cumplir este requisito (al código de llamada podría resultarle extraño que deba crear una subclase de mapa algo falsa solo para este propósito).
Ver esto: http://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list –
Puede usar [Reflection] (http://download.oracle.com/javase /tutorial/reflect/index.html) – Aillyn
¿Cuál es el requisito funcional? Puede haber mejores soluciones que jugar con la reflexión. – BalusC