2015-11-23 9 views
6

Wie kann ich eine Methode schreiben, die jedes Array eines beliebigen Typs (einschließlich Primitiven) als Parameter akzeptiert?Wie übergibt man ein Array als Parameter in Java?

Zum Beispiel habe ich die beiden folgenden Anrufe arbeiten möchten:

int[] intArray = {1, 2, 3}; 
String[] strArray = {"1", "2"}; 

hasSize(intArray, 3); 
hasSize(strArray, 2); 

Der nächstgelegene ich bisher bekommen habe ist:

public static <T> boolean hasSize(T[] array, int expectedSize) 
{ 
    return (array.length == expectedSize); 
} 

... aber das tut nicht Arbeit für Primitive.

+0

es ein Array von Objekten machen? – cristianhh

+0

Ich dachte das gleiche, aber Object [] akzeptiert keine Primitiven. – Tomasito665

+0

Mögliche Duplikate von [Übergabe eines String-Arrays als Parameter an eine Funktion Java] (http://stackoverflow.com/questions/11698283/passing- A-String-Array-als-Parameter-zu-Funktion-Java) – ha9u63ar

Antwort

5

Eine primitive Array und ein Objekt Array seiner nicht ist Basisklasse außer Object teilen.

So ist die einzige Möglichkeit wäre, ein Objekt und innerhalb der Methode Prüfung zu akzeptieren, wenn es ein Array ist

public static <T> boolean hasSize(Object x, int expectedSize) 
{ 
    return (x != null) && x.getClass().isArray() ? 
     java.lang.reflect.Array.getLength(x) == expectedSize : 
     false; 
} 

Natürlich ist dies auch nicht-Arrays akzeptiert, wahrscheinlich nicht die Lösung, die Sie wollen.

Aus diesem Grund bietet das JDK meist identische Methoden für Objekt-Arrays und primitive Arrays.

+0

Fair genug. Ich werde eine ganze Batterie primitiver Array-Methoden schreiben müssen, um sie dann vollständig von jedem Array zu unterstützen. Das ist eine Schande, da die Implementierung jeder Methode bis auf den einen Parametertyp identisch ist. –

1

Wenn ich mich richtig erinnere, können Sie kein generisches Array erstellen, von dem Sie erwarten, Primitive zu haben, da die Primitiven selbst keine Klassen sind und für das Java-Generics-System nicht verfügbar sind.

Vielmehr eingehender Array würde eine Integer [], Doppel [] usw.

0

Sie Dies ist nicht genau das, was Sie wollen so etwas wie dieses

public class A { 

    public static void main (String[] args) { 

     int[] intArray = {1, 2, 3}; 
     String[] strArray = {"1", "2"}; 

     hasSize(Arrays.asList(intArray), 3); 
     hasSize(Arrays.asList(strArray), 2); 
    } 

    public static <T> boolean hasSize(List<T> array, int expectedSize) 
    { 
     return (array.size() == expectedSize); 
    } 
} 

tun. Aber Sie können den generischen Mechanismus nutzen, indem Sie das Array an die Liste übergeben und das Autoboxing erledigt die Arbeit für Sie.

Wenn dieser Ansatz für Sie gut ist, dann ok, aber wenn das kein guter Ansatz ist, unterstützt der generische Mechanismus leider keine primitiven Typen, daher müssen Sie die Methode für jeden Array-Typ überschreiben.

+0

Nein, das ist nutzlos. Es zwingt den Benutzer, {{Arrays.asList()}} aufzurufen. Wenn sie das tun, können sie auch {{Arrays.asList(). Size()}} aufrufen und einen direkten up int == int-Vergleich verwenden ohne eine Methode zu schreiben. –

0

Wie oben erwähnt, können Sie nicht primitive Array und Objekt-Array mischen, müssen Sie Wrapper-Klasse verwenden. Wenn Funktion variable Argumente wird auszunehmen dann man die Möglichkeit, das zu schreiben ist vargs Begriff

public static <T> void process(T...args) { 
    System.out.println(Arrays.toString(args)); 
} 

mit diesem Begriff in Java interne API verwendet wird

Verwandte Themen