Rendere un metodo generic

di il
24 risposte

Rendere un metodo generic

Come posso rendere questo metodo:
public static void metodo( String[][] m,int p, ecc...) {
		...(String) dati[][]);
	}
di tipo generic <> sulla sola variabile m? Vorrei evitare di scrivere anche:
public static void metodo( Integer[][] m,int p, ecc...) {
		...(Integer) dati[][]);
	}
ovvero vorrei che il metodo funzioni per qualsiasi tipo di oggetto (String, Integer, Double, ecc...)

24 Risposte

  • Re: Rendere un metodo generic

    Forse è più comodo usare il tipo Object no?
  • Re: Rendere un metodo generic

    Se mi spieghi mi fai un piacere. In pratica io ho un metodo che scrive su un file .xls una matrice di dati di tipo string ma vorrei creare un metodo che accetti come imput una matrice qualsiasi (numeri Double, numeri Integer, ecc... anche matrici di tipi primitivi se possibile...)
  • Re: Rendere un metodo generic

    Dal momento che tutti gli oggetti estendono object puoi creare un metodo ch accetta una matrice di object. Grazie al binding dinamico il metodo toString utilizzato sarà quello delle classi reali e non di object. Per i tipi "primitivi" (quindi Integer, Double, ecc..) dovrebbe funzionare!
  • Re: Rendere un metodo generic

    Se invece vuoi utilizzare i generics devi scrivere
    
    public static <T> void metodo(T[][] m){
       ...
    }
    
  • Re: Rendere un metodo generic

    Sto provando con entrambe, sia object (non ci avevo pensato) sia generic (anche io avevo già usato il tuo codice ma non funzionava, speravo ne potessi scrivere un altro) ma non funziona, mi da degli errori in rosso che non riesco a capire... mi dice dimensione non corretta... mah...
  • Re: Rendere un metodo generic

    Ok funziona, sono io che sono un inbecille... grazie per il suggerimento!

    Funzionano entrambe le soluzioni però ora ho un altro problema. C'è un comando per passare da int a Integer, da double a Double, ecc... senza dover riscrivere i metodi anche per matrici di numeri primitivi?

    Per ora ho risolto in questo modo ma non mi piace...
    int[][] dati2={{1,2,3},{4,5,6},{7,8,9}};
    		Integer[][] dati = new Integer[3][3];
    		for(int i=0;i<dati2.length;i++){
    			for(int j=0;j<dati2[0].length;j++){
    				dati[i][j]=dati2[i][j];
    			}
    		}
    Per scrivere file su excel devo ragionare con oggetti e non con tipi primitivi ma io potrei dover scrivere anche matrici di tipi primitivi...
  • Re: Rendere un metodo generic

    Purtroppo che io sappia non esistono metodi automatici per passare da int a Integer. Puoi provare, comunque, con la libreria Lang ed il metodo statico ArrayUtils.toObject(int[] array); che ti restituisce un Integer[] a partire da un int[]
  • Re: Rendere un metodo generic

    Se creo un metodo che verifica la tipologia di matrice e converte nell'oggetto corrispondente è una buona soluzione o il sistema potrebbe risultare sovraccaricato? La conversione di una matrice da int a Integer è un'operazione "veloce" oppure no?
  • Re: Rendere un metodo generic

    Tra il resto esiste un metodo come instanceof ma valido per i tipi primitivi?
  • Re: Rendere un metodo generic

    Personalmente credo che l'instanceof non possa essere utilizzato per i tipi primitivi, ma non ho mai provato. In ogni caso la creazione di un array di Integer a partire da un int[] può essere pesante, ma dipende dalla quantità di dati che tale array deve contenere. Ma il problema deriva dal fatto che tu non puoi creare in partenza un Integer[] ma solo un int[] che poi devi convertire?
  • Re: Rendere un metodo generic

    Io sto creando un metodo che mi permetta di lavorare sia con oggetti che con tipi primitivi però mi sto accorgendo che non potendo usare i generic anche con i primitivi ottengo un codice lunghissimo che una volta creato diventa difficile e ripetitivo andare ad editare in futuro...

  • Re: Rendere un metodo generic

    Beh nel caso puoi sfruttare l'overloading dei metodi per crearne diverse versioni in base al tipo di dato. Anche se in realtà non mi pare una gran soluzione nel tuo caso per le esigenze che hai!
  • Re: Rendere un metodo generic

    Capisco, va be pazienza, vedrò di accontentarmi. Comunque ho trovato un bug (credo si chiami così) con le librerie apache poi. Dove trovo un contatto e-mail?

    P.S.: Se creo un solo metodo oltre al generic (double) quando lo userò con int è chiaro che dovrò fare un cast ma questo tipo di cast è un'operazione pesante oppure no?
  • Re: Rendere un metodo generic

    Per un contatto apache non so, prova a googlare! Per quanto riguarda il cast no, non è particolarmente onerosa secondo me!
Devi accedere o registrarti per scrivere nel forum
24 risposte