06
août
2008
août
2008
Java Quiz #15
Java / JEE ›
Java Quiz
|
Tags :
java
Par Olivier Croisier
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.
public final class AddUtils { public static Number add(Collection<Integer> ints) { int sum = 0; for (int i : ints) { sum += i; } return sum; } public static Number add(Collection<Long> longs) { long sum = 0; for (long l : longs) { sum += l; } return sum; } public static void main(String... args) { List<Integer> ints = Arrays.asList(1, 2, 3, 4); Number intSum = AddUtils.add(ints); List<Long> longs = Arrays.asList(1L, 2L, 3L, 4L); Number longSum = AddUtils.add(longs); System.out.println(intSum.equals(longSum)); } }
Réponse la semaine prochaine !
Commentaires
Il ne compile pas ? Je vois deux problèmes :
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>.
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.
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.
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 :)
En fin de compte, c'était quel point technique qui devait être mis en avant ?