# Cannot create a generic array of T



## mrbela (7. Feb 2013)

Hallo Leute!

Ich habe folgende Methode, die aber gar nicht so relevant ist.


```
public <T> List<T> filter(int startPosition, Class<T> tClass) {
        
        List<T> list = new ArrayList<>();
 
        for (int i = startPosition; i < datas.size(); i++) {
            
            if (datas.get(i).getClass().isAssignableFrom(tClass)) {
                list.add((T) datas.get(i));
            } else {
                break;
            }
        }
        
        return list;
    }
```

Am Ende dieser Methode habe ich ein Objekte List<T> list. Dies würde ich allerdings gerne als Array haben!

Aber ein solcher Code:


```
T[] array = new T[list.size()];
```

spuckt die obige Fehlermeldung aus...

Gibts irgendwelche Ideen ob sich das lösen lässt?!

Bisher mache ich die Umwandlung in ein Array immer nach dem Aufruf der obigen methode, mit Hilfe von:


```
List<Regionalklasse> rksList = filter(2, Regionalklasse.class);		
		Regionalklasse[] rks = new Regionalklasse[rksList.size()];
		rksList.toArray(rks);
```

oder  z.b.:


```
List<Unfall> unfallList = filter(2 + rksList.size(), Unfall.class);				
		Unfall[] unfaelle = new Unfall[unfallList.size()];
		unfallList.toArray(unfaelle);
```

Das produziert aber sehr viel Code, den man sich sparen könnte, wenn die Methode gleich Arrays zurückgeben könnte.


Vielen Dank für die Hilfe!!


----------



## Marcinek (7. Feb 2013)

Nein, das geht aufgrund des Type Erasure nicht.


----------



## mrbela (7. Feb 2013)

Also muss ich, wie unten beschrieben jede ArrayList "per Hand" in ein Array umbauen?!

Verstehe aber nicht ganz, wieso man ArrayLists generisch erstellen kann, nicht aber Arrays...


----------



## Marcinek (7. Feb 2013)

Galileo Computing :: Java ist auch eine Insel - 9 Generics<T>


----------



## nillehammer (7. Feb 2013)

Es gibt eine Lösung, die auch wieder das Klassenobjekt hernimmt, um die Type Erasure zu umgehen:

```
T[] array = (T[]) Array.newInstance(tClass, list.size());
```
[EDIT]Ach guck! Hab grad gesehen, dass die o.g. Lösung auch in dem von Marcinek verlinkten Insel-Kapitel geschildert wird.[/EDIT]


----------



## Meno Hochschild (7. Feb 2013)

Warum muß es ein Array sein? Arrays und Generics beißen sich. Und unter dem Aspekt der Typsicherheit gibt es mittlerweile keinen ernsthaften Grund, in neuen Programmen noch Arrays zu verwenden. Eine Ausnahme ist lediglich die Programmierung gegen veraltete Legacy-APIs mit Arrays in Schnittstellen.


----------

