# Generische Array



## Hero (19. Jan 2012)

Hallo,
ich versuche gerade Generische Array zu erzeugen aber irgendwie haut es nicht ganz so hin. Also ich hab mir es so gedacht gehabt, dass ich eine Generisches Array in einer Klasse erstellen und die Größe, soll über einen Konstruktor übergeben bekommen.

Also wie erstellt man einen generischen Array?

Ich hab mich im Internet dämlich gesucht aber nichts gefunden außer das es in Java total komisch ist es zu erstellen.

Ich hoffe ihr könnt mir helfen.


----------



## Michael... (19. Jan 2012)

Was verstehst Du unter einem generischen Array?
Bzw. was hast Du damit vor?


----------



## Hero (19. Jan 2012)

Unter Generisch verstehe ich ansich, dass man nicht den gleichen Algorithmus auf mehrere Typen anwenden muss.

Ich mach das nur um Java besser zu verstehen aber ich dachte mir Methoden zu benutzen, wo man die Position und <E> Wert angibt, wo es dann reingespeichert wird oder mir einen Wert zurück gibt, wenn ich der Methode eine Position übergebe.


----------



## AlexSpritze (19. Jan 2012)

Meinst du eine ArrayList?


```
ArrayList<Object> arrayList= new ArrayList<Object>(5);
      arrayList.add(new Object());
      Object o = arrayList.get(0);
```


----------



## Hero (19. Jan 2012)

Ich dachte ehr an sowas


```
class GenArrayBox<T> 
{ 
  private T[] array = new T[ 2 ];   // Hier sagt Eclipse, dass er keinen generischen Array vom Typ T erstellen kann.
  T[] getArray() { return array; } 
}
```


----------



## guest636 (19. Jan 2012)

Sowas geht nunmal nicht, da generische Typinformationen zur Laufzeit schlichtweg nicht mehr existieren. Stichwort _Type Erasure_. Warum verwendest du eigentlich keine Collection?


----------



## Gast2 (19. Jan 2012)

Ja, das mit den Generics und Arrays ist immer so ne Sache 

Du könntest deine Klasse so aufbauen:

```
class GenArrayBox<T> {
	private final T[] array;

	public GenArrayBox() {
		array = (T[]) new Object[2];
	}

	T[] getArray() {
		return array;
	}
}
```
Dann knallts allerdings wenn du folgendes versuchst:

```
GenArrayBox<Integer> gen = new GenArrayBox<Integer>();
		Integer[] arr = gen.getArray();
```
Du kannst in Java kein 
	
	
	
	





```
new T[2]
```
 Array erzeugen. Tuts nicht auch ne Liste?

EDIT:
Was natürlich geht ist folgendes:

```
class GenArrayBox<T> {
	private final T[] array;

	public GenArrayBox(Class<T> c) {
		array = (T[]) Array.newInstance(c, 2);
	}

	T[] getArray() {
		return array;
	}
}
```
Dann musst du allerdings im Konstruktor die Klasse übergeben. Dann klappt auch dein getArray()


----------



## Hero (19. Jan 2012)

Super Danke, dass ich mit den Casten nicht früher drauf gekommen .

Ja eine Liste wäre natürlich optimaler aber als ich zum erstenmal von den generischen Typen gehört hatte wollte ich lernen wie es Funktioniert und einen Array womit man quasi jeden Typen initialisieren kann, ist doch interessant.


----------



## Gast2 (19. Jan 2012)

Naja, dafür gibts ja die Methode 
	
	
	
	





```
Array.newInstance
```
 

Wenn man mit generics arbeitet, dann sollte man sich möglichst weit von Arrays fernhalten, die beiden passen einfach (noch?) nicht zusammen.


----------



## Hero (20. Jan 2012)

Eine Frage hätte ich noch und zwar,
jetzt hab inzwischen die Methoden angelegt wo, die länge des Arrays bestimmt wird, wo Werte in in dem Array gespeichert werden usw.

Jetzt zum Frage: der Nutzer sagt:


```
MyGenArray<Integer> test= new MyGenArray<Integer>(Integer.class,3);
		test.setLengt(4);
		test.setElement(5, 1); //Fehler ArrayIndexOutOfBoundsException
```

Das soll nur bei try/catch abgefangen werden und an *array.length+1* gespeichert werden

dafür hab ich, folgendes geschrieben:


```
public void setElement(int pos, E data){
		 try{
			 array[pos]= data; //Das geht, wenn der Parameter 
		 }catch (ArrayIndexOutOfBoundsException e){
			  
			 System.err.print(" Der übergebene Wert ist außerhalb, des gültigen Bereiches");		
			 
			 array=(E[]) new Object[array.length+1];
			 array[array.length]=data;
			 System.out.println(" Da der Wert ungültig ist, wird für Data ein neues Array Behählter angelegt an der Position array.length+1");
			 }
	 }
```

Das Problem ist, dass er nur die Fehlermeldung ausgibt aber den Wert nicht an array[*array.length+1*] speichert. Wie kann ich ich ihn sagen, dass er weiterarbeiten soll?


----------



## hdi (20. Jan 2012)

Das Problem ist, dass im catch-Block _wieder _eine ArrayIndexOutOfBoundsException fliegt:


```
array[array.length]=data;
```

Du denkst scheinbar, dass hier array.length noch den alten Wert hat. Aber in der Zeile drüber hast du der Variablen array ja bereits das neue Array zugewiesen, entsprechend liefert array.length auch genau die Größe dieses neue Arrays. Und ein Zugriff auf das lenght-te Fach ist immer OutOfBounds, denn Array-Indizes beginnen bei 0. Das letzte Fach ist immer *length-1*.

Abgesehen davon: Dir ist schon klar, dass alle alten Werte im ursprünglichen Array nun verloren sind, und im neuen Array nicht enthalten sind?!


----------



## Hero (20. Jan 2012)

Aah ! Klar :lol:
Denkfehler aber trotzdem danke für die Hilfe.


----------

