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?
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.
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)
.
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.
Tags und Links java arrays collections function-declaration