2012-06-25 4 views
16

Wir verwenden einige Varargs Funktionen und als wir zu Java 1.7 bewegen wir bekommen eine seltsame ungeprüfte Warnung.Java 1.7 varargs Funktion als unchecked Warnung gemeldet

Funktion in der Schnittstelle ICache hinzufügen

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

in einer Schnittstelle meldet den Fehler.

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 erweitert Object als generische Cache-Klasse.

Ich lese die Xlint Warnungen und wir kompilieren mit unchecked on, aber http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings scheint zu implizieren, dass dieser Fehler ein [varargs] Typ nicht ein unchecked Typ sein sollte.

Fehle ich etwas?

+0

Können wir alle relevanten Teile von ICache und SomeClass sehen? –

+0

Editiert, um Quelle hinzuzufügen. –

+1

Werfen Sie einen Blick auf [diese offizielle Oracle-Site] (http://docs.oracle.com/javase/7/docs/technotes/guides/language/non-retificable-varargs.html), es erklärt Varals Heap Verschmutzung im Detail Warum löst der Java 7 Compiler eine Warnung aus und wie kann er unterdrückt werden? – buc

Antwort

2

Heap Pollution ist ein Begriff, der sich auf einen Typ bezieht, der auf ein Objekt verweist, bei dem es sich nicht um den Supertyp von Varargs mit einem generischen Typ handelt. Es tritt ein, wenn sich eine Variable eines parametrisierten Typs auf ein Objekt bezieht, das nicht von diesem parametrisierten Typ ist. This Post-on-Stack-Überlauf erklärt Ihnen genau, was dies bedeutet und was Sie dagegen tun sollten, und gibt Details zur @SafeVarargs Annotation. Also, in der Schnittstelle ICache, Vararg Typ O zeigt auf Object in Ihrer Schnittstelle, aber O ist nicht der Supertyp von Object, und dies erzeugt eine Heap-Verschmutzungswarnung. Beachten Sie, wie es heißt möglich Haufen Verschmutzung. Wenn Ihr Code keine Probleme verursacht, wie zum Beispiel zu einem ClassCastException führt, wird es wahrscheinlich sicher sein und den Heap nicht verschmutzen, aber der Compiler hat keine Möglichkeit, dies zu beweisen und kann die Korrektheit der Operation nicht verifizieren, so dass es immer noch den Warnung. Das ist eigentlich die Definition einer ungeprüften Warnung: Wenn die Korrektheit einer Operation mit einem parametrisierten Typ nicht verifiziert werden kann. Weitere Informationen finden Sie unter this Oracle-Seite zu nicht verifizierbaren Typen. Wenn Sie diese Warnung nicht erhalten möchten, können Sie sie mit SafeVarargs verhindern oder einfach unterdrücken, indem Sie der Methodendeklaration @SuppressWarnings ({"unchecked", "varargs"}) hinzufügen. Sie erhalten jedoch keine Warnung, falls die Methode tatsächlich unsicher ist.

Verwandte Themen