CSC 3101 – Algorithmique et langage de programmation

Portail informatique

Classes génériques

Vous pouvez retrouver le jeu ici.

Quelle expression déclare et instancie un Bag paramétré par Chat ?
  1. Chat<Bag> o = new Chat<>();
  2. Chat<Bag> o = new Chat<>("Garfield");
  3. Bag<Chat> o = new Bag<>();
  4. Bag<Chat> o = new Bag<>("Garfield");
Bag<Chat> o = new Bag<>();

Par quoi faut-il remplacer "???" pour que le programme soit correct ?
  1. class Bag
  2. class Bag<E>
  3. class Bag<E extends Chat>
  4. class Bag<E implements Chat>
class Bag<E extends Chat>();. La classe Chat est paramétrée par E, et E doit étendre Chat car la méthode Bag.ditMiaou() invoke la méthode E.ditMiaou();. La réponse class Bag<E implements Chat> est à éliminer car qu'un paramètre hérite d'une autre classe ou mette en œuvre une autre classe, on utilise le mot clé extends.

Comment déclarer et instancier un Bag avec un propriétaire Chat et contenant des Monster ?
  1. Bag<Chat, Monster extends Monster> o = new Bag<>();
  2. Bag<Monster, Chat> o = new Bag<>();
  3. Bag<Chat, Monster> o = new Bag<>();
  4. Monster<Bag, Chat> o = new Monster<>();
Bag<Chat, Monster> o = new Bag<>();. On ne met jamais extends quand on déclare une référence vers une instance d'une classe générique : le extends peut être utilisé lors de la déclaration des paramètres d'une classe générique.

Qu'affiche ce programme ?
  1. Le programme ne compile pas
  2. Miaou!
  3. MiaouTchoum!
  4. Rien
MiaouTchoum!. Le programme est correct car (i) on peut affecter la référence vers le ChatEnrhume à la variable chat puisqu'un chat est de type Chat et qu'un ChatEnrhume hérite de Chat, et (ii) le champ element de bag est de type Chat puisque le paramètre E vaut Chat dans Bag<Chat>. Comme le champ bag.element référence un objet de type ChatEnrhume, c'est la méthode ditMiaou() de ChatEnrhume qui est invoquée.