# Generics - "Unchecked cast"-Warnung wegbekommen



## Mizar (20. Dez 2009)

Hallo alle miteinander!

Ich habe vor kurzem angefangen mich mit Generics in Java zu beschäftigen und habe mir zum besseren Verständnis ein kleines Dynamisches Array zusammengebastelt. Hier mal der, auf die wichtigsten Elemente gekürzte Code:

```
import java.util.Arrays;

public class DynamischesArray<E>
{
	private Object[] data;
	private int size;
	private int capacity;
	
	public DynamischesArray()
	{
		this(16); // 16 = Standardkapazität
	}
	
	public DynamischesArray(int capacity)
	{
		this.size = 0;
		this.capacity = (capacity < 1 ? 16 : capacity);
		this.data = new Object[capacity];
	}
	
	public E get(int index)
	{
		if(index >= size) {
			throw new ArrayIndexOutOfBoundsException();
		}
		return (E)data[index]; // Warnung: Type safety: Unchecked cast from Object to E
	}
	
	public E remove(int index)
	{
		if(index >= size) {
			throw new ArrayIndexOutOfBoundsException();
		}
		E temp = (E)data[index]; // Warnung: Type safety: Unchecked cast from Object to E
		if(index == size - 1) {
			data[index] = null;
		} else {
			for(int i = index; i + 1 < size; ++i) {
				data[i] = data[i + 1];
			}
		}
		--size;
		return temp;
	}
	
	public E set(int index, E element)
	{
		if(index >= size) {
			throw new ArrayIndexOutOfBoundsException();
		}
		E temp = (E)data[index]; // Warnung: Type safety: Unchecked cast from Object to E
		data[index] = element;
		return temp;
	}
    /* Weitere Methoden wie z. B. add(), size(), etc. */
}
```
An den kommentierten Stellen erhalte ich aber in Eclipse eine "Unchecked cast"-Warnung. Nun stellt sich mir die Frage, ob man diese Warnungen auf irgendeine Art und Weise wegbekommen könnte (außer durch '@SuppressWarnings("unchecked")'), da ich zu den Leuten gehöre die Warnungen ungern ignorieren. Oder ist es womöglich "normal" das man bei der Verwendung von Generics solche Warnungen erhält, denn, wie eingangs erwähnt, habe ich ja noch nicht soviel mit Generics zu tun gehabt.

Schon einmal vielen Dank im voraus.


----------



## Tobias (20. Dez 2009)

Da man von generischen Typen keine Arrays bilden kann, wirst du die Warnung hier nicht wegbekommen. Du kannst aber "beweisen", dass der Cast sicher ist - daher ist ein @SupressWarning hier ok.


----------



## gman (20. Dez 2009)

Du könntest das Objekt-Array als:


```
private E[] data;
```

deklarieren, aber dann bekommst du Probleme mit dem Konstruktor in Zeile 18. An der Stelle muss das Array dann mit dem konkreten Typ erzeugt werden. Da bin ich aber mit meinem Generic-Latein auch schon am Ende 

EDIT: Mist jetzt fällt es mir wieder ein, da war ja was mit Generics und Arrays. Und wieder selber was dazu gelernt.


----------



## eRaaaa (20. Dez 2009)

gman hat gesagt.:


> Du könntest das Objekt-Array als:
> 
> 
> ```
> ...



jepp,

du könntest mit


```
private E[] data;
//....

 this.data = (E[]) (new Object[capacity]);
```

zumindestens alle anderen warnings umgehen, dann hättest du nur an dieser einen stelle eine. ganz ohne warnung auszukommen wirst du nicht hinbekommen :noe:


----------



## Mizar (20. Dez 2009)

Vielen lieben Dank Tobias. An das Unterdrücken von Warnungen muss ich mich als "alter" C++'ler zwar noch gewöhnen, aber wenn es in diesem Fall okay ist, dann kann ich damit leben.

@gman: Ja, das hatte ich auch probiert, aber als ich dann versucht hatte ein "E"-Array zu erstellen und diese Fehlermeldung zu sehen bekam: "Cannot create a generic array of E", habe ich es lieber sein lassen. 



eRaaaa hat gesagt.:


> ganz ohne warnung auszukommen wirst du nicht hinbekommen :noe:


Eine Sache an die ich mich, wie zuvor gesagt, echt noch gewöhnen muss.


----------

