2015-11-23 15 views
6

Come posso scrivere un metodo che accetti qualsiasi array di qualsiasi tipo (incluse le primitive) come parametro?Come passare qualsiasi array come parametro in Java?

Per esempio, vorrei entrambe le seguenti chiamate a lavorare:

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

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

Il più vicino che ho ottenuto finora è:

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

... ma questo non lo fa lavoro per i primitivi.

+0

rendono un array di oggetti? – cristianhh

+0

Stavo pensando lo stesso, ma Object [] non accetta le primitive. – Tomasito665

+0

Possibile duplicato di [Passaggio di un array di stringhe come parametro a una funzione java] (http://stackoverflow.com/questions/11698283/passing- a-string-array-come-a-parametro-a-a-funzione-java) – ha9u63ar

risposta

5

Una matrice primitiva e una matrice di oggetti non condividono sono classe base Integer tranne Object.

Quindi l'unica possibilità sarebbe quella di accettare un oggetto e dentro l'assegno metodo se si tratta di una serie

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

Naturalmente questo accetta anche i non-array, probabilmente non la soluzione che si desidera.

Per questo motivo il JDK fornisce principalmente metodi identici per matrici di oggetti e matrici primitive.

+0

Abbastanza giusto. Dovrò scrivere una batteria intera di metodi di array primitivi per renderlo completamente compatibile con qualsiasi array. È un peccato perché l'implementazione di ogni metodo sarà identica, tranne per il tipo di un parametro. –

1

Se ricordo correttamente, non è possibile creare un array generico che si presume abbia le primitive, poiché i primitivi stessi non sono classi e non sono disponibili per il sistema generico Java.

Piuttosto, la matrice in entrata dovrebbe essere un [], Double [], ecc

0

si può fare qualcosa di simile

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); 
    } 
} 

Questo non è esattamente quello che vuoi. Ma puoi sfruttare il meccanismo generico passando la matrice da elencare e l'autoboxing fa il lavoro per te.

Se questo approccio va bene allora ok, ma se non è un buon approccio, sfortunatamente il meccanismo generico non supporta i tipi primitivi, quindi è necessario sovrascrivere il metodo per ogni tipo di array.

+0

No, questo è inutile. Costringe l'utente a chiamare {{Arrays.asList()}}, che se lo fa, può anche chiamare {{Arrays.asList(). Size()}} e usare un confronto diretto int == int senza scrivere un metodo. –

0

Come sopra menzionato, non è possibile combinare array primitivi e array di oggetti, è necessario utilizzare la classe wrapper. Se la funzione sta per tranne argomenti variabili quindi un modo di scrivere che utilizza vargs nozione

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

questa nozione è utilizzata in Java API interna

Problemi correlati