java - Posible contaminación del montón a través del parámetro varargs




2 Answers

Cuando usted declara

public static <T> void foo(List<T>... bar) el compilador lo convierte a

public static <T> void foo(List<T>[] bar) luego a

public static <T> void foo(List[] bar)

Entonces surge el peligro de que erróneamente asigne valores incorrectos a la lista y el compilador no generará ningún error. Por ejemplo, si T es una String , el siguiente código se compilará sin error pero fallará en tiempo de ejecución:

// First, strip away the array type (arrays allow this kind of upcasting)
Object[] objectArray = bar;

// Next, insert an element with an incorrect type into the array
objectArray[0] = Arrays.asList(new Integer(42));

// Finally, try accessing the original array. A runtime error will occur
// (ClassCastException due to a casting from Integer to String)
T firstElement = bar[0].get(0);

Si revisó el método para asegurarse de que no contenga tales vulnerabilidades, puede anotarlo con @SafeVarargs para suprimir la advertencia. Para interfaces, utilice @SuppressWarnings("unchecked") .

Si recibe este mensaje de error:

El método de Varargs podría causar la contaminación del montón de un parámetro de Varargs no reificable

y está seguro de que su uso es seguro, entonces debería usar @SuppressWarnings("varargs") lugar. Ver ¿Es @SafeVarargs una anotación apropiada para este método? y https://stackoverflow.com/a/14252221/14731 para una buena explicación de este segundo tipo de error.

Referencias:

java eclipse generics variadic-functions

Entiendo que esto ocurre con Java 7 cuando se usan varargs con un tipo genérico;

Pero mi pregunta es ...

¿Qué significa exactamente Eclipse cuando dice "su uso podría contaminar el montón?"

Y

¿Cómo previene esto la nueva anotación @SafeVarargs ?




Cuando usa varargs, puede resultar en la creación de un Object[] para mantener los argumentos.

Debido al análisis de escape, el JIT puede optimizar esta creación de matriz. (Una de las pocas veces que lo encontré lo hace) No se garantiza que se optimice, pero no me preocuparía por ello a menos que vea que es un problema en su perfil de memoria.

AFAIK @SafeVarargs suprime una advertencia del compilador y no cambia el comportamiento del JIT.




Related