Haldenverschmutzung ist ein Fachbegriff. Er bezieht sich auf Referenzen, die einen Typ haben, der kein Supertyp des Objekts ist, auf das sie zeigen.
List<A> listOfAs = new ArrayList<>();
List<B> listOfBs = (List<B>)(Object)listOfAs; // points to a list of As
Dies kann zu "Unerklärlichem" führen. ClassCastException
s.
// if the heap never gets polluted, this should never throw a CCE
B b = listOfBs.get(0);
@SafeVarargs
verhindert dies in keiner Weise. Es gibt jedoch Methoden, die den Heap wahrscheinlich nicht verschmutzen, der Compiler kann es nur nicht beweisen. Früher bekamen die Aufrufer solcher APIs lästige Warnungen, die völlig sinnlos waren, aber an jeder Aufrufstelle unterdrückt werden mussten. Jetzt kann der API-Autor sie einmalig an der Deklarationsseite unterdrücken.
Wenn die Methode jedoch tatsächlich nicht sicher ist, werden die Benutzer nicht mehr gewarnt.