Un type générique est une classe ou une interface générique qui est paramétrée par des types. Cela permet au compilateur de garantir la sécurité de type sur la classe ou l'interface.
Prenons cette interface Container non générique :
class Container {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
Comme elle accepte et renvoie des types Object, elle fonctionne avec n'importe quel type non primitif.
Cependant, cela a un coût, car du code peut appeler get en attendant des Integer alors qu'un autre appelle set en y ajoutant des String, ce qui finit par provoquer une exception à l'exécution.
Une classe générique et une interface générique ont les formats suivants :
class ClassName<T1, T2, ..., Tn> { ... }
interface InterfaceName<T1, T2, ..., Tn> { ... }
La section des paramètres de type, délimitée par des chevrons (<>), qui suit le nom de la classe ou de l'interface, indique les paramètres de type (aussi appelés variables de type) T1, T2, ..., et Tn.
On peut les utiliser dans le corps de la classe ou de l'interface pour obtenir la sécurité de type générique.
Voici la version générique de Container :
class Container<E> {
private E object;
public void set(E object) { this.object = object; }
public E get() { return object; }
}
Lorsqu'on le crée, il faut maintenant déclarer le type qu'il contient, et le compilateur fera respecter cette contrainte :
// empty <> can infer from context
Container<String> stringContainer = new Container<>();
// compiler knows this is a String, so it is allowed
stringContainer.set("Some string");
// no cast needed, compiler knows it is a String
String result = stringContainer.get();
// this causes a compiler error:
stringContainer.set(42);
Les listes sont la collection ordonnée d'éléments en Java.
Contrairement aux tableaux, une List peut grandir en taille pour accueillir n'importe quel nombre d'éléments.
L'une des implémentations standard est ArrayList, qui s'appuie sur un tableau que l'on peut redimensionner.
Une autre implémentation standard est la classe LinkedList, qui s'appuie sur une liste doublement chaînée.
Les Lists peuvent être vides ou contenir un nombre quelconque d'éléments (y compris des doublons).
Les Lists sont une interface générique typée pour indiquer le type d'objets qu'elles peuvent contenir.
Par exemple :
List<String> emptyListOfStrings = List.of();
List<Integer> singleInteger = List.of(1);
List<Boolean> threeBooleans = List.of(true, false, true);
List<Object> listWithMultipleTypes = List.of("hello", 1, true);
Les Lists disposent de diverses méthodes utiles pour ajouter, supprimer ou récupérer un élément, et pour vérifier sa présence :
List<Character> vowels = new ArrayList<>(List.of('a', 'e', 'i', 'o', 'i', 'e', 'a'));
int startingSize = vowels.size(); // 7
vowels.add('u'); // vowels is now ['a', 'e', 'i', 'o', 'i', 'e', 'a', 'u']
char a = vowels.get(0); // 'a'
boolean hadI = vowels.remove('i'); // true and vowels is now ['a', 'e', 'o', 'i', 'e', 'a', 'u']
boolean hasI = vowels.contains('i'); // true (still have one more left)
Karl veut tenir à jour un tableau des langages qu'il souhaite apprendre sur le site d'Exercism. Karl doit pouvoir ajouter de nouveaux langages, en retirer d'anciens et vérifier si certains langages figurent dans le tableau. Ce serait vraiment enthousiasmant si Karl voulait apprendre Java ou Kotlin !
Karl doit savoir si son tableau de langages devient un jour vide, pour pouvoir aller en chercher d'autres à apprendre !
Définis une méthode appelée isEmpty qui renvoie true s'il n'y a aucun langage dans le tableau.
if (languageList.isEmpty()) {
findMoreLanguagesToLearn();
}
Karl a hâte d'apprendre Kotlin et Python !
Aide Karl à démarrer en définissant une méthode appelée addLanguage qui prend le langage qu'il veut apprendre et l'ajoute au tableau.
languageList.addLanguage("Kotlin");
languageList.addLanguage("Python");
Karl a décidé qu'il ne voulait pas apprendre Scala pour le moment.
Aide Karl à le retirer du tableau en définissant une méthode appelée removeLanguage qui prend le langage qu'il retire et le supprime du tableau.
languageList.removeLanguage("Scala");
Karl veut se souvenir du premier langage qu'il a ajouté au tableau (et qui s'y trouve encore).
Définis une méthode appelée firstLanguage qui renvoie le premier langage du tableau.
String kotlin = languageList.firstLanguage(); // "Kotlin"
Karl a besoin de savoir combien de langages il essaie d'apprendre.
Aide Karl à trouver la réponse en définissant une méthode appelée count qui renvoie le nombre de langages dans le tableau.
int two = languageList.count(); // 2
Karl essaie de se rappeler s'il voulait apprendre Python ou Ruby.
Définis une méthode appelée containsLanguage qui prend le langage sur lequel il s'interroge, pour que Karl puisse le savoir !
boolean learningPython = languageList.containsLanguage("Python"); // true
boolean learningRuby = languageList.containsLanguage("Ruby"); // false
Si Karl veut apprendre Java ou Kotlin, c'est très enthousiasmant !
Définis une méthode appelée isExciting qui renvoie vrai si Karl veut apprendre Java ou Kotlin.
javaLanguageList.isExciting() // true
neitherKotlinNorJavaLanguageList.isExciting() // false
Inscris-toi sur Exercism pour apprendre et maîtriser Java avec 26 concepts158 exercices, et un vrai mentorat humain, le tout gratuitement.