Pourquoi utiliser printf(“%s”) pour les arguments passés à des méthodes génériques?
package genericMethods;
public class OverloadedMethods {
/**
* @param args
*/
public static void main(String[] args) {
//TODO Auto-generated method stub
Integer[] integerArray = {1, 2, 3, 4, 5};
Double[] doubleArray = {1.0, 2.0, 3.0, 4.0, 5.0};
Character[] charArray = {'a', 'b', 'c', 'd'};
System.out.println("A has: ");
printArray(integerArray);
System.out.println("B has: ");
printArray(doubleArray);
System.out.println("C has: ");
printArray(charArray);
}
public static <T> void printArray(T[] array)
{
for(T element : array)
System.out.printf("%s ", element);//why use %s instead of others?
System.out.println();
}
}
Ma question est la méthode printArray() ne sait pas de quel type de données à imprimer, et il semble qu' %d va se produire d'erreur au moment de l'exécution - mais n'est-ce pas %s pour une Chaîne uniquement ?
- Veuillez consulter la docs.oracle.com/javase/6/docs/api/java/util/Formatter.html. Par ailleurs, vous êtes l'impression de la
element
commeString
. - Parce que vous avez une Chaîne de représenter quoi que ce soit, d'un flotteur, un entier, un octet, un personnage, tandis que les autres types ne peuvent se représenter eux-mêmes.
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous ne SAVEZ pas quel type de "élément" sera. Dans votre exemple, il pourrait être Entier, Double, ou un Personnage. Cela étant le cas, vous ne pouvez pas utiliser %d ou %lf, parce que ceux qui ne travaillent pas pour les types qui ne sont pas de type Entier (pour %d) ou Double (pour lf%).
%s fonctionne réellement pour tous, parce que tous les types d'Objets ont une .toString(), de sorte qu'ils peuvent être convertis en Chaînes de caractères pour l'impression.
L'utilisation de
%s
sera le résultat dans letoString()
appel d'une méthode sur l'objet, et donc ne peut travailler pour n'importe quel type deT
.java.util.Formattable
, puis l'objetformatTo
méthode sera invoquée. De cette façon on peut réservertoString
pour sebugging, etprintf
ouformat
à usage humain.Prendre en compte que presque tout peut être transformé en une Chaîne de caractères, que ce soit par le
toString()
méthode ou tout simplement en ajoutant des valeurs primitives.Quand
%s
est donné, ce sera à son tour quel que soitelement
est dans une Chaîne.Formatter
fonctionne, pas sur la façon de génériques de travail. Vous pouvez certainementprintf
primitives (bien que je crois qu'ils vont être mis en boîte), et la question utilise l'encadré sur les types de toute façon.