Générer un type de tableau variable en sortie de méthode
Résolu
neocol
Messages postés
63
Date d'inscription
Statut
Membre
Dernière intervention
-
neocol Messages postés 63 Date d'inscription Statut Membre Dernière intervention -
neocol Messages postés 63 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
cette commande :
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:
Si vous avez des idées je serai reconnaissant,
Cordialement,
Merci
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
-
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.-
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) -
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. -
-