Tengo dos métodos que hacen algo muy similar: recibe un mapa y luego lo imprime en un archivo de salida, excepto que reciben diferentes tipos de datos del mapa y Java (IntelliJ, de hecho) no me permite sobrecargarlo y dice 'parse(Map<String, Long>)' clashes with 'parse(Map<Set<String>, Integer>)'; both methods have same erasure .
Método A:
private static void parse(Map<String, Long> map) { PrintWriter output = null; try { output = new PrintWriter("output1.csv"); } catch (FileNotFoundException e) { e.printStackTrace(); } assert output != null; map.entrySet().forEach(output::println); output.close(); }Método B:
private static void parse(Map<Set<String>, Integer> map) { PrintWriter output = null; try { output = new PrintWriter("output2.csv"); } catch (FileNotFoundException e) { e.printStackTrace(); } assert output != null; map.entrySet().forEach(output::println); output.close(); }Siempre podría hacerlos dos métodos diferentes con nombres diferentes, pero eso haría que mi código se viera innecesariamente largo y torcido, así que estoy tratando de evitarlo.
¿Qué estoy haciendo mal aquí? Por favor iluminame.
eso se debe al tipo de cosa de borrado en Java. básicamente, después de la compilación, su código se verá así
private static void parse(Map map) { } private static void parse(Map map) { }mirando el código. ¿Por qué no simplemente hacer la firma del método de esta manera?
private static void parse(Map<?, ?> map, String fileName) { }de esa manera, también evitaría una sobrecarga innecesaria.
Puede sobrecargar un método con DIFERENTES parámetros, diferente número de parámetros de diferentes tipos de parámetros. En su código de ejemplo, Java verá ambos métodos como iguales, ya que tienen el mismo parámetro de entrada, que es Map, puede agregar otro parámetro en uno de estos métodos para que funcionen.
Sí tu puedes. Todos son iguales, además, la declaración única en la que usa el parámetro es map.entrySet(), que es https://docs.oracle.com/javase/8/docs/api/java/util/Map.html# conjunto de entrada--
Entonces solo tiene que usar el Mapa de interfaz <V, K>, aquí hay un ejemplo de cómo implementar generis en Map Generic Map Parameter java