lässt eine Java-Funktion eine Sammlung oder ein Array akzeptieren

8

Ich versuche eine Funktion zu schreiben, die einige Zeichenfolgen benötigt und etwas damit macht.

Das Einzige, was ich tun werde, ist, dass die Menge der Strings sich über sie legt. Gerade jetzt habe ich ein kompliziertes Konstrukt nach dem Vorbild von

%Vor%

was sich seit

überflüssig anfühlt %Vor%

wäre ein vollkommen gültiger Code für myStrings vom Typ String [].

Gibt es eine Klasse, die ich akzeptieren kann, die sowohl Sammlungen als auch Arrays erlaubt?

    
BostonJohn 10.12.2012, 18:45
quelle

3 Antworten

8

Siehe Warum ist ein Array nicht zu Iterable zuweisbar?

Kurze Antwort: Nein. Array-Typen sind synthetischer Code, wie ich es verstehe, und implementieren daher nicht Iterable oder andere Typen. Sie müssen eine überladene Methode bereitstellen oder verlangen, dass Clients Arrays.asList am Aufrufstandort aufrufen.

    
Tom G 10.12.2012, 18:48
quelle
3

Leider implementiert das Array Iterable nicht, obwohl die for-each-Schleife an beiden funktioniert.

Sie konnten ausschließlich Iterable akzeptieren, da das Umgehen von Arrays etwas altmodisch ist (die Leistungsvorteile von Arrays gegenüber ArrayList sind vernachlässigbar). Ein vorhandenes Array kann einfach umgebrochen und in ein List konvertiert werden, indem Arrays.asList(T... a) .

    
Steve Kuo 10.12.2012 18:48
quelle
1

Obwohl Arrays in einer for-each-Schleife verwendet werden können, implementieren sie nicht Iterable . Es gibt einfach zwei Möglichkeiten, entweder die Methode wie angegeben zu überladen oder nur die iterierbare Variante anzugeben und den Client dazu zu zwingen, Arrays.asList() aufzurufen.

Wenn Sie auch die Array-Überladung bereitstellen möchten, können Sie die Signatur vom einfachen Array in varargs ändern:

%Vor%

Achten Sie in diesem Fall auf die Inkompatibilität zwischen primitiven Arrays und primitiven Wrapper-Arrays:

%Vor%

und:

%Vor%

Und der dunkelste Teil, mit generischen varargs:

%Vor%

Wenn Sie ein Array von Ganzzahlen übergeben:

%Vor%

Der Wert von ts ist ein Array von Ganzzahlen mit 2 Elementen: 1 und 2 .

Wenn Sie jedoch ein Array von primitiven Ints übergeben, passiert eine lustige Sache:

%Vor%

In diesem Fall ist der Wert von ts ein Array von int-Arrays ( int[][] ) mit nur einem Element, das das ursprünglich übergebene Array ist. Der Grund dafür ist, dass ein int kein Object ist (Autoboxing hilft hier nicht), während ein Array von ints ist, so dass der Wert des Parameters T type int[] wird.

    
Natix 10.12.2012 19:04
quelle