La surcharge - polymorhpisme ad hoc

La surcharge - polymorhpisme ad hoc #

Nous avons vu dans la précédente section le polymorphisme de sous-typage (qui sera également approfondi dans le prochain chapitre). Un autre type important à comprendre est le polymorphisme ad hoc. Il s’agit en fait de la surcharge (overload) à ne pas confondre avec la redéfinition (override).

Les méthodes d’une même classe (ou d’une même hiérarchie de classes) peuvent porter le même nom si elles ont une liste de paramètres différente, c’est-à-dire:

  • les paramètres sont différents : le nombre ou leur type
  • un type de retour différent ne permet d’appliquer une surcharge

Ce mécanisme est très utile, il permet de déterminer à la compilation quelle méthode appeler en fonction du type d’une expression.

1
2
3
4
5
class Test {
  void test(int i) { System.out.println("int: " + i); }
  void test(short s) { System.out.println("short: " + s); }
  void test(Schtroumpf s) { System.out.println("Je suis un schtroumpf: " + s.schtroumpf()); }
}
1
2
3
4
5
6
7
Test t = new Test();

t.test(10); // int: 10
short s = 10;
t.test(s); // short: 10
t.test(s + s); // int: 10 (promotion numérique)
t.test(new Schtroumpf()); // Je suis un schtroumpf: SCHTROUMFP !

Exemple avec String #

La méthode substring est surchargée ; le nombre d’arguments diffère:

  • String substring(int beginIndex) retourne la sous-chaîne débutant à l’indice beginIndex
  • String substring(int beginIndex, int endIndex) retourne la sous-chaîne compris entre beginIndex et endIndex
1
2
"- test *".substring(2); //==> "test *"
"- test *".substring(2, 6); //==> "test"

La méthode statique valueOf est surchargée ; le type d’arguments diffère:

  1. static String valueOf(int)
  2. static String valueOf(boolean)
  3. static String valueOf(Object)
1
2
3
String s1 = String.valueOf(3); // appelle la première
String s2 = String.valueOf(true); // appelle la deuxième
String s3 = String.valueOf("Hello"); // appelle la troisième. String est un objet

Quiz #

La méthode println est également surchargée, voici un extrait des signatures existantes:

  1. void println()
  2. void println(int)
  3. void println(boolean)
  4. void println(Object)
  5. void println(String)

Pour chaque ligne suivante, indiquez quelle version est choisie par le compilateur:

1
2
3
4
5
System.out.println( 4+5 );
System.out.println( 4+5 < 10 );
System.out.println( LocalDate.now() );
System.out.println();
System.out.println( LocalDate.now().toString() );











comments powered by Disqus