Rueckgabe von generischem Array

Freaky123

Mitglied
Zur erstellen sind verschiedene Regale mit Java Generics. In einem Regal koennen immer nur eine Art von Objecten vorkommen.
Eine get() Methode liefert ein einzelnes Object zurueck, put() stellt ein Element in ein Regal.
putAll() stellt alle Objecte des uebergebenen Arrays in das Regal.
Sobald ich ein Element herausgenommen habe wird das in einem temporaeren Array aufbewahrt (tmp_books, tmp_dvd...)
Mein Problem ist die getAll() Methode ich weis nicht wie ich da die Elemente alle herausnehemen soll??


Java:
public static void main(String[] args) {
		
		//Neue Regale werden erzeugt in der Klasse shelf
		shelf<Book> bookshelf = new shelf<Book>();
		shelf<wineBottle> wineshelf = new shelf<wineBottle>();
		shelf<CD> cd = new shelf<CD>();
		shelf<DVD> dvd = new shelf<DVD>();

                //Temporaere Regale fuer die Aufbewahrung
		Book[] tmp_books = new Book[100];
		wineBottle[] tmp_wine = new wineBottle[100];
		CD[] tmp_cd = new CD[100];
		DVD[] tmp_dvd = new DVD[100];
		
		//Elemente werden eingefuegt
		bookshelf.put(new Book("The island", "John Meyers"));
		bookshelf.put(new Book("Atlas", "Nobody"));
		bookshelf.put(new Book("New York", "Steven Frank"));
		
		cd.put(new CD("Bon Jovi", 12));
		cd.put(new CD("Greenday", 13));
		cd.put(new CD("ACDC", 18));
		
		dvd.put(new DVD("Shutter Island", 110));
		dvd.put(new DVD("Pulp Fiction", 100));

		wineshelf.put(new wineBottle("Magdalener", "rot"));
		wineshelf.put(new wineBottle("Blauburgunder", "rot"));


}


public class shelf<T> {

	protected T[] data;
	protected int i=0;
	
	@SuppressWarnings("unchecked")
	public shelf() {
		this.data = (T[]) new Object[100];
	}
	
	
	public void put(T element) {
		this.data[i] = element;
		i++;
	}
	
	public T get() {
		
		if (i>0) {
			i--;
		
		T element = this.data[i];
		this.data[i] = null;
		return element;
		}
		else return null;
		
		}
	
	
	public void putAll(T[] elements) {
		
		for(int j=0; j<elements.length; j++) {
			if(elements[j]!=null) {
			this.data[i] = elements[j];
			elements[j]=null;
			i++;
			}
		}
	}


	public T[] getAll() {
		
		// Keine Ahnung wie ich die Zurueckgeben soll??
		
		
	
	
	}
}
 
Ja das hatte ich auch schon nur mit was ruf ich die Methode auf?
Wenn ich in der main Methode

Java:
tmp_books = bookshelf.getAll();

und in der fuer die getAll() Methode
Java:
T[] tmp = this.data;
this.data = null;
return tmp;

aufrufe krieg ich ne ClassCastException
 
tja, das T[] ist eigentlich nur ein Object[], kannst du nicht in einer Book[]-Variablen ablegen

du könntest in shelf auf umständlicheren Weg oder in der getAll-Methode ein Array vom richtigen Typ anlegen,
java.util.List-en machen das auch in ihrer toArray()-Methode
Java:
    public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
	System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

-----
aus Arrays.copyOf():
  (T[]) Array.newInstance(class, newLength);
wichtig ist dass irgendeine Info vorhanden ist, T alleine als generischer Parameter reicht nicht, entweder ein T-Objekt, T.class oder auch ein T[] muss vorhanden sein (Parameter von außen)


-------

vielleicht gibst du der Einfachheit halber tmp_books an die getAll()-Methode? dann kann das Array befüllt werden


----

zeitgleiches Thema:
http://www.java-forum.org/java-basi...305-classcastexception-generisches-array.html
 
Zuletzt bearbeitet von einem Moderator:
Fuer die Ubergabe einfach sowas:

Java:
public static void main(String[] args) {

tmp_books = bookshelf.getAll(tmp_books);
}

public T[] getAll(T[] array) {
		
		int index=0;
		for (int j=0; j<array.length; j++) {
			if (array[j]==null) index = j; break;
		}
		
		while (i>0) {
			array[index] = this.get();
		}
		return array;
	
	
	}

Brach ich da jetzt ueberhaupt eine Ruckgabewert oder wuerde es auch nur mit void gehen?
Also so?

Java:
public static void main(String[] args) {

bookshelf.getAll(tmp_books);
}

public void getAll(T[] array) {
		
		int index=0;
		for (int j=0; j<array.length; j++) {
			if (array[j]==null) index = j; break;
		}
		
		while (i>0) {
			array[index] = this.get();
		}
		
	
	
	}
 
Getter haben immer Rückgabewerte. Wenn du diesen aber nicht benötigst, dann entferne ihn und ändere den Namen der Methode.
Bei dir macht die Methode aber keinen Sinn ohne Rückgabewert. Das Array wird sonst nach beenden der Methode wieder gelöscht.
 

Zurück
Oben