2011-05-27 27 views
5
public Object[] convertTo(Map source, Object[] destination) { 
    ... 
} 

¿Existe la posibilidad de averiguar los tipos genéricos (clave/valor) de mi parámetro de mapa a través de Reflection?Obtiene el tipo genérico para el parámetro java.util.Map

+0

¿Por qué querrías hacer eso? Ese es el propósito de ese método? – helpermethod

+1

No entiendo completamente la pregunta, pero creo que la respuesta podría estar en el código de [Collection.toArray()] (http://download.oracle.com/javase/6/docs/api/java/util /Collection.html#toArray%28T[]%29). – Augusto

+0

Su mapa real no tiene tipos genéricos, actualmente asigna 'Objeto' a' Objeto'. –

Respuesta

8

Dado un Map<Key,Value>, no es posible averiguar Key y Value en tiempo de ejecución. Esto se debe a type erasure (también, vea Wikipedia).

Sin embargo, es posible examinar cada objeto (clave o valor) contenido en el mapa, y llamar a su método getClass(). Esto le indicará el tipo de tiempo de ejecución de ese objeto. Tenga en cuenta que esto todavía no le dirá nada sobre los tipos de compilación Key y Value.

+3

* Por supuesto * no funciona si el mapa está vacío * por supuesto * da resultados incorrectos si los tipos genéricos son interfaces o clases abstractas ... –

+1

En realidad es posible si el mapa está subclasificado, por ejemplo, 'StringMap extiende Map {...'. Consulte [TypeTools] (https://github.com/jhalterman/typetools) para ver un ejemplo de cómo extraer los tipos args. – Jonathan

1

Puede inspeccionar la Clase para ver las entradas en el objeto fuente obteniendo cada elemento y llamando a getClass en el objeto clave/valor para cada uno. Por supuesto, si el mapa no fue genérico en origen, entonces no hay garantía de que todas las claves/valores en él sean del mismo tipo.

+0

¡Hola! Sí, eso podría funcionar ... Pero también tengo el método inverso, donde tengo que convertir de Object [] a Map. Y allí no puedo usar este enfoque. – Sebi

+0

* Por supuesto * no funciona si el mapa está vacío * por supuesto * da resultados incorrectos si los tipos genéricos son interfaces o clases abstractas ... –

1

No se puede obtener el tipo de valor a partir del mapa en tiempo de ejecución, pero tal vez se puede obtener de la matriz destination (siempre y cuando no es null.)

public <V> V[] convertTo(Map<?,V> source, V[] destination) { 
    return source.values().toArray(destination); 
} 
1

De esta manera se puede obtener el tipo de la clave y el valor de un mapa

public class Demo 
{ 
    public static void main(String[] args) 
    { 
     Map map = new HashMap<String, Long>(); 
     map.put("1$", new Long(10)); 
     map.put("2$", new Long(20)); 
     Set<?> set = map.entrySet(); 
     Iterator<?> iterator = set.iterator(); 
     String valueClassType=""; 
     while (iterator.hasNext()) 
     { 
      Map.Entry entry = (Entry) iterator.next(); 
      valueClassType = entry.getValue().getClass().getSimpleName(); 
      System.out.println("key type : "+entry.getKey().getClass().getSimpleName()); 
      System.out.println("value type : "+valueClassType); 
     } 
    } 
} 
10

sé que esta pregunta es antiguo, pero la mejor respuesta es incorrecta.
Puede obtener fácilmente los tipos genéricos mediante reflexiones. Aquí un ejemplo:

private Map<String, Integer> genericTestMap = new HashMap<String, Integer>(); 

public static void main(String[] args) { 

    try { 

     Field testMap = Test.class.getDeclaredField("genericTestMap"); 
     testMap.setAccessible(true); 

     ParameterizedType type = (ParameterizedType) testMap.getGenericType(); 

     Type key = type.getActualTypeArguments()[0]; 

     System.out.println("Key: " + key); 

     Type value = type.getActualTypeArguments()[1]; 

     System.out.println("Value: " + value); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Esto le dará la salida:
Key: class java.lang.String
Value: class java.lang.Integer

+1

Esta debería ser la respuesta aceptada – Sergio

+0

La respuesta aceptada es correcta . Está recuperando el tipo genérico de la declaración. Este no es el mismo problema que recuperar el tipo genérico en tiempo de compilación de una instancia de objeto para la cual se ha borrado la información del tipo genérico. Específicamente, el OP tipeó el parámetro Map sin parámetros genéricos (implícitamente ) a partir de los cuales se podría recuperar esta información.Su respuesta, aunque útil para su caso específico, no aborda la pregunta. – Dave

+0

@Sergio - no es la respuesta aceptada por una razón – Dave

Cuestiones relacionadas