Функция Java 1.7 varargs, объявленная как непроверенное предупреждение

Мы используем некоторые функции varargs, и по мере перехода на java 1.7 мы получаем странное предупреждение.

Функция добавления интерфейса ICache

public interface ICache<O> {
    void add(Object source, O... objects);
}

в интерфейсе сообщается об ошибке.

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 расширяет объект как свой общий класс кеша.

Я прочитал предупреждения xlint, и мы выполним компиляцию с помощью unchecked on, но http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings, по-видимому, подразумевает, что эта ошибка должна быть типом [varargs], а не unchecked тип.

Я что-то пропустил?

Ответ 1

Загрязнение кучи - это термин, который относится к типу, указывающему на объект, который не является супертипом при использовании varargs с общим типом. Это происходит, когда переменная параметризованного типа относится к объекту, который не относится к этому параметризованному типу. Это сообщение о переполнении стека объясняет вам, что именно это означает и что вам следует делать, и дает подробную информацию об аннотации @SafeVarargs. Таким образом, в интерфейсе ICache тип vararg O указывает на Object в вашем интерфейсе, но O не является супертипом Object, и это порождает предупреждение о загрязнении кучи. Обратите внимание на то, как он говорит о возможном загрязнении кучи. Если ваш код не вызывает никаких проблем, например, приводит к ClassCastException, он, вероятно, будет безопасным и не загрязняет кучу, но компилятор не может доказать это и не может проверить правильность операции, поэтому он все равно будет сгенерировать предупреждение. На самом деле это определение непроверенного предупреждения: когда правильность операции с параметризованным типом не может быть проверена. См. эту страницу Oracle для невосстанавливаемых типов для получения дополнительной информации. Если вы не хотите получать это предупреждение, вы можете предотвратить его с помощью SafeVarargs или просто подавить его, добавив @SuppressWarnings ({"unchecked", "varargs"}) к объявлению метода, но вы не получите предупреждение в том случае, если метод действительно небезопасен.