Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Java Quiz #15

Que fait ce code ?

Edit : Le code a été modifié pour corriger certaines typos qui empêchaient de démontrer le point technique mis en avant dans ce quiz.

  1. public final class AddUtils {
  2.  
  3. public static Number add(Collection<Integer> ints) {
  4. int sum = 0;
  5. for (int i : ints) {
  6. sum += i;
  7. }
  8. return sum;
  9. }
  10.  
  11. public static Number add(Collection<Long> longs) {
  12. long sum = 0;
  13. for (long l : longs) {
  14. sum += l;
  15. }
  16. return sum;
  17. }
  18.  
  19. public static void main(String... args) {
  20. List<Integer> ints = Arrays.asList(1, 2, 3, 4);
  21. Number intSum = AddUtils.add(ints);
  22.  
  23. List<Long> longs = Arrays.asList(1L, 2L, 3L, 4L);
  24. Number longSum = AddUtils.add(longs);
  25.  
  26. System.out.println(intSum.equals(longSum));
  27. }
  28. }

Réponse la semaine prochaine !


Commentaires

1. Le jeudi 7 août 2008, 11:21 par Bh@Mp0

Il ne compile pas ? Je vois deux problèmes :

  • la conversion float->int au niveau de la méthode "add(Collection<Float> floats)" pour la variable "sum"
  • le fait que la signature des deux méthodes "add" soient la même ; en l'occurrence : "add(Collection) -> int"
2. Le lundi 11 août 2008, 10:14 par Histrion

D'accord avec Bh@Mp0 : les deux signatures sont identiques (float ? je suis après la typo ?) ; il faudrait utiliser une classe générique AddUtils<T>.

3. Le lundi 11 août 2008, 10:30 par Histrion

Hmm... j'ai voulu essayer de faire fonctionner une classe générique AddUtils<T> le compilateur me dit qu'il faut que les objets de type T soient +=ables.

4. Le lundi 11 août 2008, 12:36 par HollyDays

Bh@Mp0, Histrion : pourquoi dites-vous que les 2 signatures sont identiques ? D'un côté, on a "Number add(Collection<Integer>)" et de l'autre "Number add(Collection<Long>)". Or Collection<Integer> et Collection<Long>, ce n'est pas le même type : essayez donc de faire une affectation de l'un à l'autre...

Je précise que si ma question peut sembler naïve, c'est volontaire : je connais très précisément le point technique mis en évidence par ce quizz, ayant aidé Olivier dans la mise au point de celui-ci.

5. Le lundi 11 août 2008, 14:19 par Bh@Mp0

HollyDays: il me semblait que, même dans les dernières versions de Java, la précision du typage au niveau des paramètres ne jouait pas un rôle dans la signature car ignoré. C'est-à-dire que, pour les deux méthodes données, il s'agirait de : "add(Collection) -> Number" et non "add(Collection<Integer>) -> Number" + "add(Collection<Long>) -> Number)", d'où la non-compilation du code.

D'ailleurs, je viens de re-tester de compiler le code donné ci-dessus et cela correspond bien à ce problème.

Autrement, je ne vois pas le point technique à démontrer, même si je me doute que c'est lié à ça :)

6. Le mercredi 10 septembre 2008, 11:10 par Bh@Mp0

En fin de compte, c'était quel point technique qui devait être mis en avant ?

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.