Classes génériques
Vous pouvez retrouver le jeu
ici.
Quelle expression déclare et instancie un Bag paramétré par Chat ?
- Chat<Bag> o = new Chat<>();
- Chat<Bag> o = new Chat<>("Garfield");
- Bag<Chat> o = new Bag<>();
- Bag<Chat> o = new Bag<>("Garfield");
Bag<Chat> o = new Bag<>();
Par quoi faut-il remplacer "???" pour que le programme soit correct ?
- class Bag
- class Bag<E>
- class Bag<E extends Chat>
- 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 ?
- Bag<Chat, Monster extends Monster> o = new Bag<>();
- Bag<Monster, Chat> o = new Bag<>();
- Bag<Chat, Monster> o = new Bag<>();
- 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 ?
- Le programme ne compile pas
- Miaou!
- MiaouTchoum!
- 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.