# Warning: Type safety: Potential heap pollution via varargs parameter array



## Claudia92 (10. Jul 2012)

Hallo miteinander!

Was will mir der Compiler mit der im Titel stehenden Warnung sagen? Das kommt immer dann, wenn ich eine Methode mit generischen Varags verwende.

Beispiel: Folgende statische Methode dreht die Reihenfolge ihrer Parameter um:

```
public static <T> T[] reverse(T... array) {
		for (int i = 0; i < array.length / 2; i++) {
			T swap = array[i];
			array[i] = array[array.length - 1 - i];
			array[array.length - 1 - i] = swap;
		}
		return array;
	}
```

PS: Ja, diese Methode lässt sich bestimmt anders auch schreiben - ich will aber nur wissen, was diese Warnung bedeuten soll.

Danke für jede Antwort!


----------



## haui95 (10. Jul 2012)

Setze mal folgende Annotation über deine statische Methode reverse  


```
@SafeVarargs 
public static <T> T[] reverse(T... array) {
              ...
}
```

Edit:

Die Warnung bzw. Meldung wird vom Compiler ausgespuckt, da Array Typen in Verbindung mit Generics "non-reifiable" sind, dass heißt, dass solche Typen nicht komplett zur Laufzeit verfügbar sind, da beim Kompilieren Informationen in Bezug auf Parameter  und Argumente gelöscht werden. Das Löschen der Information ist insofern ganz sinnvoll, da man dadurch eine Kompatibilität zwischen Libraries oder auch Programmen, die vor den Generics erstellt wurden, herstellt.

MfG


----------



## Claudia92 (10. Jul 2012)

Das heißt, ich kann (immer?) ein @SafeVarargs davorsetzen und darf diese Warnung getrost ignorieren?
Nicht, dass mir meine Programme deswegen irgendwann um die Ohren fliegen!


----------



## Gast2 (10. Jul 2012)

Mit der Annotation sagst du dem Compiler dass du weißt was du da in der Methode tust und er dich damit nicht nerven soll. Wenn du allerdings mist machst in der Methode, dann kanns da knallen.

Mehr Infos dazu hier:
fahd.blog: Java 7: Safe Varargs Method Invocation
AngelikaLanger.com - Java Generics FAQs - Programming With Java Generics - Angelika Langer Training/Consulting


----------



## haui95 (10. Jul 2012)

Genau, du kannst die Compiler Meldung getrost ignorieren, da es lediglich nur eine belanglose Warnung ist, die dem User einfach nur mitteilt, dass Informationen zur Laufzeit gelöscht werden. 
Du könntest auch einfach vor deiner Methode ein 
	
	
	
	





```
@SuppressWarnings("unchecked")
```
 setzen, jedoch unterdrückt diese Annotation alle Compiler Warnungen, deshalb benutzt man eigentlich ab Java 5.0, also seit dem Java Generics kennt, die 
	
	
	
	





```
@SafeVarargs
```
 Annotation.

MfG

Hauke


----------



## Ullenboom (30. Jul 2012)

Als kleine Ergänzung noch: @SafeVarargs gibt es erst seit Java SE 7, also zwei Versionen nach der Einführung von Generics. Das liegt an der Verschiebung des "Schuldigen". Vor Java 7 war der Aufrufer "Schuld" und musste annotiert werden, jetzt nur noch der "Schulidige" annotiert, aber nicht mehr der Aufrufer. Teste das mal mit einer anderen Compilereinstellung.


----------

