java java-7 javac variadic-functions heap-pollution

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?