ArrayList<Foo> in ein Foo[] konvertieren?

mrbela

Bekanntes Mitglied
Hey Leute!

Ich habe eine ArrayList<Foo> vorliegen und brauche davon ein Array vom Typ Foo, das natürlich die gleichen Elemente enthält, wie die ArrayList.

Ich könnte mir natürlich ne Methode bauen, die das für mich erledigt, wär nicht schwer, aber denoch suche ich nach built-in Funktionen, die das erledigen und habe bspw. die "toArray()"-Methode gefunden... Die spuckt aber leider nur ein Object[] aus, obwohl ich die ArrayList anfangs mit dem Typ Foo ausgeprägt habe... :/

Habt ihr irgendne Idee wie ich ans Ziel kommen kann?

Danke!
 
Es gibt noch eine toArray() Funktion:

Java:
List<String> list = new ArrayList<>();
String[] array = new String[list.size()];
array = list.toArray(array);
 
Ahhh! Okay.. Danke! 🙂

Aber man kann ja schon sagen, dass die toArray() veraltet ist, oder? Was will man denn mit einem Object-Array noch anfangen... Außer man benutzt toSTrings oder ähnliches. 😉

Sind denn

Java:
List<String> list = new ArrayList<>();

und

Java:
List<String> list = new ArrayList<String>();

gleichwertig? Vermutlich wird zweiteres automatisch vom Compiler aus ersterem erstellt?!?

Danke
 
Nein, die Methode ist nicht veraltet. Die ist überladen und kann auch ein T[] Array zurückgeben, was im Code von Mostly_Harmless ja auch gemacht wird.

Zu deiner zweiten Frage:
Code:
new ArrayList<>();
<- Das ist der Diamond Operator, den es seit Java 7 gibt. Im Prinzip sind die beiden Ausdrücke gleichwertig, nur dass der erste erst ab Java 7 funktioniert.
 
Aber man kann ja schon sagen, dass die toArray() veraltet ist, oder? Was will man denn mit einem Object-Array noch anfangen...

Die Methode stammt halt aus der Zeit, in der es noch keine generischen Typen in Java gab. Ob es heute noch sinnvolle Anwendungsfälle dafür gibt, weiß ich nicht.
Aber um noch einen Schritt weiterzugehen: Was will man denn mit einem Array überhaupt noch anfangen? Ich nutze nur noch Listen, damit ist man wesentlich flexibler und wenn hinter dem List-Interface eine ArrayList steckt, dann hat man im Grunde ein "besseres Array" 😉

Sind denn

Java:
List<String> list = new ArrayList<>();
und
Java:
List<String> list = new ArrayList<String>();

gleichwertig? Vermutlich wird zweiteres automatisch vom Compiler aus ersterem erstellt?!?

Genau, das nennt sich Diamond-Operator und ist ab Java 7 möglich.
 
Was will man denn mit einem Array überhaupt noch anfangen

Mmmh, ich glaube, ich muss Arrays benutzen, da ich mit varargs arbeite.

Ich habe eine Methode

Java:
bla(Foo1 f1, Foo2 f2, Foo3... f3s)

Wenn ich diese aufrufe, dann muss ich doch als drittes Argument ein Array nehmen, bzw mehrere Objekte vom Typ f3:

Java:
Foo1 f1 = ...;
Foo2 f2 = ...;
Foo3 f3erstes = ...;
Foo3 f3zweites = ...;
bla(f1,f2,f3erstes, f3zweites)
.

Jetzt habe ich aber folgendes Problem (vielleicht gibts da ja auch noch ne elegantere Lösung!):

Ich habe eine Methode, die am besen so aussähe:

Java:
meineMethode(Foo1 f1 , Foo2... foo2s, Foo3... foo3s)

Die varargs gehen aber nicht zwei mal hintereinander, also muss ich auf

Java:
meineMethode(Foo1 f1, Objet... os)

ausweichen oder??

WEnn die frage geklärt ist poste ich den Rest des Problems 😉

edit: und dann auch, weshalb ich Arrays brauche.
 
Ich habe eine Methode, die am besen so aussähe:

Java:
meineMethode(Foo1 f1 , Foo2... foo2s, Foo3... foo3s)

Die varargs gehen aber nicht zwei mal hintereinander, also muss ich auf

Java:
meineMethode(Foo1 f1, Objet... os)

ausweichen oder??

Genau, die erste Version lässt sich nicht kompilieren, da es sein könnte, dass der Compiler die Grenze zwischen Foo2- und Foo3-Parametern nicht automatisch bestimmen kann.
Aber bevor du nun auf Object umsteigst und anschließend in der Methode anfängst die Typen zu überprüfen und zu casten:
Warum nicht
Java:
meineMethode(Foo1 f1, Foo2[] f2, Foo3[] f3)
oder so
Java:
meineMethode(Foo1 f1, List<Foo2> f2, List<Foo3> f3)
?
 
Genau, die erste Version lässt sich nicht kompilieren, da es sein könnte, dass der Compiler die Grenze zwischen Foo2- und Foo3-Parametern nicht automatisch bestimmen kann.

Das verstehe ich nicht ganz... :/ Wäre nett, wenn Du es nochmal in andern Worten erklären könntest.

Aber bevor du nun auf Object umsteigst und anschließend in der Methode anfängst die Typen zu überprüfen und zu casten:
Warum nicht
Java:
meineMethode(Foo1 f1, Foo2[] f2, Foo3[] f3)
oder so
Java:
meineMethode(Foo1 f1, List<Foo2> f2, List<Foo3> f3)
?

Hast völlig recht!! Object und Casts sind eht hässlich. Da steig ich lieber auf eine Varianter von den zwei oben um.

Danke!
 
Das verstehe ich nicht ganz... :/ Wäre nett, wenn Du es nochmal in andern Worten erklären könntest.

Nehmen wir mal an, du hättest gerne eine Methode
Java:
void doSomething(Object... o, String... s)

Dann wäre ja Folgendes völlig legitim:
Java:
Object o1, o2, o3;
String s1, s2, s3;
doSomething(o1, o2, o3, s1, s2, s3);

Ein String ist aber auch ein Object. Zählt s1 hier zu Object oder zu String?
Hier könnte man noch argumentieren, dass die Grenze zwischen o3 und s1 liegt, da s1 als String deklariert wurde.

Was ist aber, wenn du jetzt z.B. zwei Interfaces A und B hast, sowie eine Klasse K, die beide Interfaces implementiert?
Java:
void doSomething(A... a, B... b) {
    // ...
}

void andereMethode() {
   K k1, k2, k3;
   doSomething(k1, k2, k3);
}

Wo ist hier die Grenze zwischen Objekten des Typs A und denen vom Typ B?
 

Zurück
Oben