2010-10-05 18 views
8

Cuando trato de crear dos métodos de sobrecarga estáticos, recibí un error de compilación. ¿Alguien puede explicar estoSobrecarga de métodos estáticos con genéricos

public class A { 
public static void a(Set<String> stringSet) {} 
public static void a(Set<Map<String,String>> mapSet) {} 
} 
+0

¿Cuál es el error? – kasten

Respuesta

14

La razón es type erasure. Los genéricos no se almacenan en las clases, solo son información en tiempo de compilación, por lo que en tiempo de ejecución, los dos métodos son idénticos y, por lo tanto, hay un conflicto de nomenclatura.

Referencia

Estos tres métodos son en realidad idénticos (es decir: que producen bytecode idéntico):

public static void a(Set plainSet) {} 
public static void a(Set<String> stringSet) {} 
public static void a(Set<Map<String,String>> mapSet) {} 

Si realmente desea tener dos métodos separados, debe proporcionar diferentes firmas de métodos (p. diferentes nombres de métodos, un parámetro adicional para uno de los métodos, etc.)

+0

La resolución del método se realiza en tiempo de compilación, por lo que el lenguaje Java podría extenderse para permitir este tipo de sobrecarga sin reificación. Sin embargo, es probablemente más simple insistir en un mejor método de nombres. –

+0

Sí, pero el objetivo era no romper el formato binario (el código heredado tenía que seguir funcionando, incluso con un nuevo código) –

1

Desde el punto de vista de los métodos, los parámetros Set<String> y Set<Map<String,String>> son iguales, porque todas las instancias de una clase genérica tienen la misma clase de tiempo de ejecución (Establecer en su caso), independientemente de sus parámetros de tipo real. Por lo tanto, obtendrá un erasure error. También en tiempo de ejecución tanto se verá así ... public static void a(Set stringSet) {} Y public static void a(Set mapSet) {}

0

Tienes el error de compilación porque los métodos no están sobrecargados correctamente. Ambos métodos tienen un parámetro de tipo Set que hace que ambos métodos sean idénticos para el compilador.