Methoden Generische Methode für ArrayList

MerlinFlys

Mitglied
Hallo,

folgende Methode funktioniert wenn ich mit Integer arbeite. Sie soll aber generisch sein, da die übergebenen Objekte ebenfalls generisch sind.
Java:
public T[] getP() {
  ArrayList<T> p = new ArrayList<T>();
  getElements(rObjekt, p);
  int size = p.size();
  return p.toArray(new<T>[size]);
}

Die Methode getElements füllt die ArrayList mit den entsprechenden Werten. Die Methode getP() soll nun diese Werte in einer ArrayList zurückgeben.

Der Fehler erscheint im return Statement:
Syntax error, insert "ClassType ( )" to complete Expression

Wo liegt mein Denkfehler?

Danke.
Merlin
 
Zuletzt bearbeitet von einem Moderator:
Du weißt anscheinend nicht, dass Java type erasure betreibt und somit Generics nur ein Compilezeittrick ist.
Was gehen würde:
Java:
public T[] getP() {
  ArrayList<T> p = new ArrayList<T>();
  getElements(rObjekt, p);
  return (T[]) p.toArray();
}
Was ist zur Laufzeit verfügbar an Typinformationen:
Java:
public Object[] getP() {
  ArrayList p = new ArrayList();
  getElements(rObjekt, p);
  return (Object[]) p.toArray();
}
Was du aber machen könntest, damit das Typsicher ist:
Java:
public T[] getP(Class<T> clazz) {
  ArrayList<T> p = new ArrayList<T>();
  getElements(rObjekt, p);
  int size = p.size();
  return p.toArray((T[])Array.newInstance(clazz, size));
}
 
Bei einer von der Klasse, die sie enthält, unabhängig generischen Methode muss diese den generischen Parameter festlegen und in etwa so aussehen:
Java:
@SuppressWarnings("unchecked")
private <T> T[] getP() {
    List<T> list = new ArrayList<>();
    getElements(rObjekt, p);
    return (T[]) list.toArray();
}
Das setzt jedoch voraus, dass auch die Methode #getElements generisch sein muss und "<T>" enthalten muss. Das Problem zieht sich also durch.
#getP ist übrigens IMHO ein blöder Name, weil er null Aussagekraft hat, was die Methode eigentlich macht.
Und #getElements suggeriert, dass eine Elementenliste zurückgegeben wird, was es nicht tut.

Insgesamt ist das eine etwas abstruse Architektur, die du hier vorschlägst und ich denke, so wie du es jetzt verwendest, wrappst du nur eine Methode in eine andere: Verwende einfach nur #getElements und gut ist.
Und in den meisten Fällen solltest du auch lieber mit dem List<T> Interface arbeiten, anstatt mit primitiven Arrays. Darin gibt es nur in Randfällen einen Gewinn (Performance, aber dann muss ALLES auf Arrays und primitive Datentypen ausgelegt sein und nicht von List zu Array zu List, und weiss der Kuckuck wie sonst noch, hin und her gecastet werden, denn dass ist eher eine teure Operation...).
 
vielen Dank für die Antworten ! 🙂
Ich habe jetzt für die Methode den Rückgabetyp ArrayList <T> definiert.

Nur kommt jetzt folgende Fehlermeldung:

"java.lang.IllegalArgumentException: wrong number of arguments"

Java:
public ArrayList <T>  getP ()
    {
         ArrayList <T> p = new ArrayList <T> ();
      
        getElements (rObjekt, p);
        return  p;
    }

die Methode getElements ist generisch angelegt.
 
Hab jetzt das Problem anders gelöst.
Ich hab sichergestellt, dass die eingelesenen Daten Integer Werte sind. Damit funktionierts. Die generische Methode wäre für den Fall der Fälle. Das ist jetzt ausgeschlossen.
vielen Dank euch ! 🙂
 

Zurück
Oben