Générer un type de tableau variable en sortie de méthode

Résolu/Fermé
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 - Modifié par neocol le 26/10/2015 à 22:35
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 - 27 oct. 2015 à 00:01
Bonjour,

cette commande :

Arrays.copyOfRange(arraySource, sourcePositionStart, sourcePositionStop);


permet de faire une copie de arraySource, l'avantage qu'elle a cette commande, c'est qu'elle te permet une position de départ sourcePositionStart et une position d'arrêt sourcePositionStop. Il faut sourcePositionStart < sourcePositionStop. Elle retourne un tableau du même type(String, int, double ...) que arraySource.

Ma question est, comment écrire une méthode qui à elle permet de définir le type de arraySource alors la sortie doit être de même type que la source.J'ai essayé ce petit de code, mais je n'ai pas réussi:
public static Object[] customCloneArray(Object[] source, int sourcePositionStart, int sourcePositionStop){

Object[] ouput = null;
try {
if(source instanceof String[]){
ouput = (String[])Arrays.copyOfRange(source, sourcePositionStart, sourcePositionStop);
}else if(source instanceof Integer[]){
ouput = (Integer[])Arrays.copyOfRange(source, sourcePositionStart, sourcePositionStop);
}

} catch (java.lang.IllegalArgumentException e) {
e.printStackTrace();
}
return ouput;
}


Si vous avez des idées je serai reconnaissant,
Cordialement,
Merci

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
26 oct. 2015 à 23:30
Bonjour,

Pour faire ce que tu veux il te manque la généricité, c'est à dire qu'au lieu de renvoyer Object[] il faudrait que tu renvoies un E[] où E est le même type que le tableau E[] de la source : on précise ce paramètre avec <E>

public static <E> E[] customCloneArray(E[] source, int sourcePositionStart, int sourcePositionStop) {
    return Arrays.copyOfRange(source, sourcePositionStart, sourcePositionStop);
}

Remarque : écrite comme ça, cette méthode ne sert à rien, autant appeler directement Arrays.copyOfRange.

Plus dur : si tu voulais écrire toi même la méthode Arrays.copyOfRange, il te faudrait alors créer un nouveau tableau E[], malheureusement il est impossible de faire un new E[n] quand E est un type générique.
Pour résoudre ce problème il faut passer par le package java.lang.reflect.*

@SuppressWarnings("unchecked")
E[] ouput = (E[]) Array.newInstance(source.getClass().getComponentType(), size);

NB. À ce moment là le tableau est vide, il faut encore le remplir avec les bonnes valeurs au bon endroit.
0
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 1
Modifié par neocol le 26/10/2015 à 23:50
Merci KX, le terme généricité est celui qui me manque à savoir. Merci pour la solution, mais
public static <E> E[] customCloneArray(E[] source, int sourcePositionStart, int sourcePositionStop) {
return Arrays.copyOfRange(source, sourcePositionStart, sourcePositionStop);
}

ne marche pas pour int[] newArray = customCloneArray(oldArray, integer, integer)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
26 oct. 2015 à 23:55
Effectivement, E est obligatoirement un objet, ça ne fonctionne pas pour les types primitifs. Pour les boolean,byte,char,short,int,long,float,double il faut faire des méthodes dédiées, on ne peut pas faire autrement.
C'est d'ailleurs pour ça que toutes les méthodes de Arrays sont dupliquées une méthode pour les objets E (ou T, ou ce que l'on veut) et huit méthodes pour chacun des huit types primitifs. C'est moche mais il n'y a pas le choix.
0
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 1
27 oct. 2015 à 00:01
oui merci pour ces informations, pour l'instant je vais utiliser
Arrays.copyOfRange
directement. Moi je voulais faire pour m'entraîner à manipuler des objets variants en sorties de méthodes.

Merci KX
0