es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Genéricos: ¿Cómo poblar un mapa a partir de arreglos?

Intenté escribir un método de utilidad que llenara un mapa a partir de una matriz de clave y valor, independientemente del tipo de datos de la clave y el valor.

public static <k,v> Map<k,v> fillMap(Map<k,v> map, K[] keys, V[] values) {
  int l= keys.length;
  for (int i=0; i<l; i++)="" map.put(keys[i],="" values[i]);="" return="" map;="" }="" ```="" luego="" llamé="" al="" método="" con:="" ```java=""></l;><integer, string=""> map= new HashMap<>();
Integer[] keys= IntStream.range(0, 12).boxed().toArray(Integer[]::new);
String[] values= new String[] {"Jan","Feb","Mar","Apr","Mai","Jun",
               "Jul","Aug","Sep","Okt","Nov","Dez"};
map= MyUtil.fillMap(map, keys, values);

y recibí el error:

incompatible types: no instance(s) of type variable(s) K,V exist so that Map<k,v> conforms to HashMap<integer,string>

Todos los intentos de reemplazar <k,v> por variaciones de <? extends Object> y similares han fallado hasta el momento.
¿Cómo se puede solucionar esto?</k,v></integer,string></k,v></integer,></k,v></k,v></k,v>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error ocurre porque la firma del método declara que puede aceptar cualquier tipo de claves y valores, pero cuando se llama al método, se pasan los tipos específicos Integer y String para el HashMap.

    Para solucionar esto, la firma del método se puede cambiar para declarar explícitamente los tipos de claves y valores que debe aceptar:

      public static <k,v> Map<k,v> fillMap(Map<k,v> map, K[] keys, V[] values) {
        int l= keys.length;
        for (int i=0; i<l; i++)="" map.put(keys[i],="" values[i]);="" return="" map;="" }="" ```="" luego,="" al="" llamar="" al="" método,="" los="" tipos="" deben="" especificarse="" explícitamente:="" ```=""></l;><integer, string=""> map= new HashMap<>();
        Integer[] keys= IntStream.range(0, 12).boxed().toArray(Integer[]::new);
        String[] values= new String[] {"Jan","Feb","Mar","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"};
        map= MyUtil.<integer, string="">fillMap(map, keys, values);
    

    Esto debería convertir correctamente el Map en un HashMap con claves Integer y valores String.</integer,></integer,></k,v></k,v></k,v>

Comments are closed.