Trotz Generics Cast-Fehler!

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi!

Ich habe eine Klasse geschrieben, welche dank Generics zwei Arrays gleichen Typs- aber egal welchen Typs- zusammenführen kann. Leider funktioniert es jedoch noch nicht richtig, da ich einen Cast-Fehler bekomme.

Die Array-Zusammenführ-Klasse sieht so aus:

Code:
package voccoach;

public class ArrayJoiner<E> {
    
    public ArrayJoiner() {
	// do nothing
    }
    
     public E[] joinArray(E[] a, E[] b) {
	  E[] temp = (E[]) new Object[a.length+b.length];
	  System.arraycopy(a,0,temp,0,a.length);
	  System.arraycopy(b,0,temp,a.length,b.length);
	  return temp;
    }

}

Eine Anwendung sieht beispielsweise so aus:
Code:
private VocFile[] localVocFiles;
// [...]
localVocFiles = new ArrayJoiner<VocFile>().joinArray(local, arFiles.toArray(new VocFile[arFiles.size()]));
Dabei entsteht jedoch diese Fehlermeldung:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lvoccoach.VocFile;

Wenn ich jedoch versuche, ArrayJoiner mit einem VocFile-Array zu typisieren...
Code:
localVocFiles = new ArrayJoiner<VocFile[]>().joinArray(local, arFiles.toArray(new VocFile[arFiles.size()]));
...kommt eine andere Fehlermeldung:
joinArray(voccoach.VocFile[][],voccoach.VocFile[][]) in voccoach.ArrayJoiner<voccoach.VocFile[]> cannot be applied to (voccoach.VocFile[],voccoach.VocFile[]).

Außerdem sollte doch auch gar kein Object-Array zurückgegeben werden, wenn ich Generics verwende?!


Die Deklaration in joinArray kann ich aber ja nicht auf ein Nicht-Array ändern, da ich sonst nicht auf die length-Methode zugreifen kann.
Code:
public class ArrayJoiner<E[]> {
ist auch nicht möglich.

Auch ein nachträgliches Casten funktioniert nicht:
Code:
public E[] joinArray(Object[] a, Object[] b) {
	a = (E[]) a;
	b = (E[]) b;

Was kann ich tun?
 
bin nicht ganz sicher
aber versuchs mal mit
Code:
E[] array = new E[a.length+b.length];
 
new Object[] funktioniert nicht, da ein Object[] nunmal kein E[] ist.
new E[] funktioniert nicht, da Generics zur Laufzeit nicht vorhanden sind.

-> such dir ein anderes Konzept.

Die Deklaration in joinArray kann ich aber ja nicht auf ein Nicht-Array ändern, da ich sonst nicht auf die length-Methode zugreifen kann.
Ein Array hat keine Methode "length", es hat ein Feld "length". Und Listen haben selbstverständlich was ähnliches: die Methode "size()". Aber Listen haben schon Methoden wie "addAll", die fast dasselbe machen wie du hier willst.
 
Abgesehen davon, dass das nach einer schönen utility-Funktion aussieht, die statisch sein könnte:
arFiles.toArray(new VocFile[arFiles.size()])
liefert erstmal ein Object[]. Gibt's irgendwelche "unchecked"-Warnungen? Sowas wie
localVocFiles = new ArrayJoiner<VocFile>().joinArray(local, (VocFile[])arFiles.toArray(new VocFile[arFiles.size()]));
schon getestet (sollte keinen Unterschied machen, aber nur aus Neugier....)
In welcher Zeile fliegt denn die Exception?
 
Abgesehen davon, dass das nach einer schönen utility-Funktion aussieht, die statisch sein könnte
Ja, aber ich brauche ja wenn dann Generics, welche ich ja nicht in einer statischen Klasse verwenden kann... .

Ja, es gibt unchecked-Warnungen (wie lass ich mir die in NB anzeigen?)

Dein Vorschlag funktioniert, wie du bereits erwartet hast, leider auch nicht.

Die Exception fliegt in der von dir veränderten Zeile.

Hmm blöd das :-/
 
Du kannst Generics auch in statische Methoden benutzen:

Code:
public static <T> void test(T t)

Aufruf mit

Code:
Klassenname.<String>test("Hallo");

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben