Java 1.7 varargs función reportada como advertencia sin marcar
java-7 javac (1)
La contaminación del montón es un término que se refiere a un tipo que apunta a un objeto del cual no es el supertipo cuando se usan varargs con un tipo genérico. Ocurre cuando una variable de un tipo parametrizado se refiere a un objeto que no es de ese tipo parametrizado. This publicación en el desbordamiento de pila le explica exactamente lo que esto significa y lo que debe hacer al respecto, y brinda detalles sobre la anotación @SafeVarargs
. Por lo tanto, en la interfaz ICache
, el tipo vararg O
está apuntando a Object
en su interfaz, pero O
no es el supertipo de Object
, y esto genera una advertencia de contaminación del montón. Observe cómo dice la posible contaminación del montón. Si su código no está causando ningún problema, como llevar a una ClassCastException
, probablemente será seguro y no contamine el montón, pero el compilador no tiene forma de demostrarlo y no puede verificar la exactitud de la operación, por lo que aún generará la advertencia. Esa es en realidad la definición de una advertencia no verificada: cuando no se puede verificar la corrección de una operación que involucra un tipo parametrizado. Vea this página de Oracle en tipos no re-fiables para más información. Si no desea obtener esta advertencia, puede prevenirla con SafeVarargs
, o simplemente suprimirla agregando @SuppressWarnings ({"unchecked", "varargs"})
a la declaración del método, pero no recibirá la advertencia en el hecho de que el método es de hecho inseguro.
Usamos algunas funciones de varargs y, a medida que avanzamos a Java 1.7, recibimos una extraña advertencia sin marcar.
Función agregar en la interfaz ICache
public interface ICache<O> {
void add(Object source, O... objects);
}
en una interfaz informa el error.
ICache.java:18: warning: [unchecked] Possible heap pollution from parameterized vararg type O
void add(Object source, O... objects);
where O is a type-variable:
O extends Object declared in interface ICache
1 warning
O extiende Object, como su clase de caché genérica.
Leí las advertencias de xlint y compilamos sin marcarlas, pero http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings parece indicar que este error debería ser un El tipo [varargs] no es un tipo sin marcar.
¿Me estoy perdiendo de algo?