Générer un type de tableau variable en sortie de méthode [Résolu/Fermé]

Signaler
Messages postés
63
Date d'inscription
mardi 4 juin 2013
Statut
Membre
Dernière intervention
6 février 2016
-
Messages postés
63
Date d'inscription
mardi 4 juin 2013
Statut
Membre
Dernière intervention
6 février 2016
-
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

Messages postés
16335
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 mai 2021
2 829
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.
Messages postés
63
Date d'inscription
mardi 4 juin 2013
Statut
Membre
Dernière intervention
6 février 2016
1
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)
Messages postés
16335
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 mai 2021
2 829
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.
Messages postés
63
Date d'inscription
mardi 4 juin 2013
Statut
Membre
Dernière intervention
6 février 2016
1
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