Übergeben einer Liste als Varargs [duplicate]

Lesezeit: 2 Minuten

Ich habe ein List<Thing> und ich möchte es an eine deklarierte Methode übergeben doIt(final Thing... things). Gibt es eine Möglichkeit, das zu tun?

Der Code sieht aus etwas so was:

public doIt(final Thing... things)
{
    // things get done here
}

List<Thing> things = /* initialized with all my things */;

doIt(things);

Dieser Code funktioniert offensichtlich nicht, weil doIt() nimmt Thing nicht List<Thing>.

Gibt es eine Möglichkeit, eine Liste als Varargs zu übergeben?

Dies ist in einer Android-App, aber ich sehe nicht, warum die Lösung nicht für Java gilt

Benutzer-Avatar
SLaks

Pass einfach things.toArray(new Thing[things.size()]).

  • Es sollte sein things.toArray(new Thing[things.size()]);.

    – Grau

    31. August 2012 um 18:03 Uhr

  • Das wird es tun. (Und ja, @Gray hat Recht, es ist etwas effizienter, das Array der entsprechenden Größe zu übergeben.)

    – xbakesx

    31. August 2012 um 18:05 Uhr

  • Beide funktionieren @newacct, aber mein Vorschlag erstellt kein Array-Objekt, das sofort GC’d werden muss.

    – Grau

    31. August 2012 um 21:44 Uhr


  • Ab Java 6 und höher ist es in der Regel performanter things.toArray(new Thing[0]).

    – Stuhlbieger

    18. Juni 2018 um 23:02 Uhr

  • @SLaks aus dem Intellij-Refactoring-Vorschlag „seit späten Updates von OpenJDK 6 war dieser Aufruf intrinsisch, wodurch die Leistung der leeren Array-Version im Vergleich zur Version mit vorkonfigurierter Größe gleich und manchmal sogar besser wurde. Auch das Übergeben von Array mit vorkonfigurierter Größe ist gefährlich für eine gleichzeitige oder synchronisierte Sammlung, da ein Datenrennen zwischen der Größe und dem toArray-Aufruf möglich ist, was zu zusätzlichen Nullen am Ende des Arrays führen kann, wenn die Sammlung während der Operation gleichzeitig verkleinert wurde.” Außerdem gibt es einen Benchmark, der zeigt, dass es schneller ist: stackoverflow.com/a/29444594/765419

    – Stuhlbieger

    20. Juni 2018 um 0:24 Uhr

Das variadische Argument wird intern als Array interpretiert. Sie sollten es also vorher in ein Array umwandeln. Auch in deiner doIt Methode sollten Sie auf die Elemente von things-s mit Array-Indizierung zugreifen.

  • Danke für die schnelle Antwort. Das funktioniert super. Gibt es einen Grund, warum Sie den Zugriff auf die Elemente über den Array-Index erwähnt haben, oder ist es mehr, dass Sie kann TU das? Es gibt keinen Grund, for(Thing t : things) nicht in doIt() zu verwenden, richtig?

    – xbakesx

    31. August 2012 um 18:04 Uhr

  • Ich kann nicht sowohl Ihre Antwort als auch SLaks Antwort als richtig markieren, daher denke ich, dass Sie seine Antwort bearbeiten und den Grund hinzufügen sollten, der funktioniert. Dann mache ich das zur richtigen Antwort. Entschuldigung, die Leute möchten den Code in der Antwort sehen.

    – xbakesx

    31. August 2012 um 18:11 Uhr

  • @xbakesx Es gibt keinen Grund, warum Sie nicht for-each verwenden können.

    – Brian

    31. August 2012 um 18:29 Uhr

  • Natürlich funktioniert die erweiterte for-Schleife mit Arrays. Ich habe gerade betont, dass die Methode der Sammlungsschnittstelle in Varargs nicht funktioniert, da es sich um ein Array handelt.

    – Zeller

    31. August 2012 um 18:42 Uhr

1158570cookie-checkÜbergeben einer Liste als Varargs [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy