Java : généricité
Achref El Mouelhi
Docteur de l’université d’Aix-Marseille
Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel
[email protected]
H & H: Research and Training 1 / 19
Plan
1 Introduction
2 Premier exemple
3 Exemple avec deux types génériques
4 Exemple avec plusieurs attributs avec le même type générique
5 Exemple avec l’héritage
H & H: Research and Training 2 / 19
Introduction
Java
Le concept objet
Une classe est composée d’un ensemble d’attributs + un
ensemble de méthodes
I
c
H
ELnom et un type (Java
U
Les attributs d’une classe ont forcément un
est fortement typé)
L MO
Le type d’attribut nere
h f E pas pour toutes les instances d’une
change
classe A c
c
Les méthodes permettent généralement d’effectuer des
opérations sur les attributs tout en respectant leurs spécificités
(type, taille...)
H & H: Research and Training 3 / 19
Introduction
Java
Problématique
Et si on a besoin d’une classe dont les méthodes effectuent les
I
mêmes opérations quel que soit le type d’attributs c
EL H
somme pour entiers ou réels,
concaténation pour chaı̂nesM de O
U
caractères,
E L
f éens...
r e
ou logique pour bool
c h
...
c A
Impossible sans définir plusieurs classes (une pour chaque
type) et une interface ou en imposant le type Object et en
utilisant plusieurs cast...
H & H: Research and Training 4 / 19
Introduction
Java
Depuis Java 5, une solution plus élégante avec la généricité
Ne pas définir de type pour les attributs
I
c
Définir un type générique qui ne sera pasE
H
L é à la création de
U précis
la classe
L MO
f E on précise le type à utiliser par cette
À l’instanciation de rlaeclasse,
h
classe A c
c
On peut donc choisir pour chaque instance le type que l’on
souhaite utiliser.
H & H: Research and Training 5 / 19
Premier exemple
Java
Une première classe avec un type générique
public class Exemple <T> {
private T var;
I c
public T getVar() { E LH
return var; O U
L M
}
ref E
c h
c A void
public setVar(T var) {
this.var = var;
}
H & H: Research and Training 6 / 19
Premier exemple
Java
Créons des instances de la même classe avec des types
différents
public static void main(String[] args) {
Exemple<Integer> entier = new Exemple<Integer>();
I c
entier.setVar(10);
System.out.println( entier.getVar().getClass(). ELH
U
getTypeName() + " " + entier.getVar());
L MO
E
Exemple<String> chaine = new Exemple<String>();
f
chaine.setVar("Bonjour");
chre
c A
System.out.println( chaine.getVar().getClass().
getTypeName() + " " + chaine.getVar());
}
H & H: Research and Training 7 / 19
Premier exemple
Java
Créons des instances de la même classe avec des types
différents
public static void main(String[] args) {
Exemple<Integer> entier = new Exemple<Integer>();
I c
entier.setVar(10);
System.out.println( entier.getVar().getClass(). ELH
U
getTypeName() + " " + entier.getVar());
L MO
E
Exemple<String> chaine = new Exemple<String>();
f
chaine.setVar("Bonjour");
chre
c A
System.out.println( chaine.getVar().getClass().
getTypeName() + " " + chaine.getVar());
}
Le résultat affiché :
java.lang.Integer 10
java.lang.String Bonjour
H & H: Research and Training 7 / 19
Exemple avec deux types génériques
Java
Exemple avec deux types génériques
public class Exemple <T,S> {
private T var1;
private S var2;
public T getVar1() {
I c
return var1;
ELH
} U
public void setVar1(T var1) {
L MO
this.var1 = var1;
f E
}
c hre
c A
public S getVar2() {
return var2;
}
public void setVar2(S var2) {
this.var2 = var2;
}
}
H & H: Research and Training 8 / 19
Exemple avec deux types génériques
Java
Testons cela
public static void main(String[] args) {
Exemple<Integer,String> couple = new Exemple<
Integer,String>();
I c
couple.setVar1(10);
ELH
couple.setVar2("Bonjour"); U
L
System.out.println(couple.getVar1().getClass(). MO
f E
hre
getTypeName()+ " " + couple.getVar1());
c
System.out.println(couple.getVar2().getClass().
}
c A
getTypeName() + " " + couple.getVar2());
H & H: Research and Training 9 / 19
Exemple avec deux types génériques
Java
Testons cela
public static void main(String[] args) {
Exemple<Integer,String> couple = new Exemple<
Integer,String>();
I c
couple.setVar1(10);
ELH
couple.setVar2("Bonjour"); U
L
System.out.println(couple.getVar1().getClass(). MO
f E
hre
getTypeName()+ " " + couple.getVar1());
c
System.out.println(couple.getVar2().getClass().
}
c A
getTypeName() + " " + couple.getVar2());
Le résultat affiché :
java.lang.Integer 10
java.lang.String Bonjour
H & H: Research and Training 9 / 19
Exemple avec plusieurs attributs avec le même type générique
Java
Exemple avec plusieurs attributs
public class Operation <T>{
private T var1;
private T var2;
public Operation(T var1, T var2) {
this.var1 = var1;
I c
}
this.var2 = var2;
ELH
U
MO
public void plus () {
if (var1.getClass().getSimpleName().equals("Double"))
E L
System.out.println(Double.parseDouble(var1.toString()) + Double.
f
hre
parseDouble(var2.toString()));
c
else if (var1.getClass().getSimpleName().equals("Integer"))
c A
System.out.println(Integer.parseInt(var1.toString()) + Integer.
parseInt(var2.toString()));
else if (var1.getClass().getSimpleName().equals("Boolean") )
System.out.println( Boolean.parseBoolean(var1.toString()) ||
Boolean.parseBoolean(var2.toString()));
else
System.out.println( var1.toString() + var2.toString());
}
}
H & H: Research and Training 10 / 19
Exemple avec plusieurs attributs avec le même type générique
Java
Testons cela
public static void main(String[] args) {
Operation <Integer> operation1 = new Operation<Integer>(5,3);
operation1.plus();
Operation <String> operation2 = new Operation<String>("bon","jour");
I c
operation2.plus();
ELH
Operation <Double> operation3 = new Operation<Double>(5.2,3.8);
U
operation3.plus();
L MO
Operation <Boolean> operation4 = new Operation<Boolean>(true,false);
operation4.plus();
f E
}
c hre
c A
H & H: Research and Training 11 / 19
Exemple avec plusieurs attributs avec le même type générique
Java
Testons cela
public static void main(String[] args) {
Operation <Integer> operation1 = new Operation<Integer>(5,3);
operation1.plus();
Operation <String> operation2 = new Operation<String>("bon","jour");
I c
operation2.plus();
ELH
Operation <Double> operation3 = new Operation<Double>(5.2,3.8);
U
operation3.plus();
L MO
Operation <Boolean> operation4 = new Operation<Boolean>(true,false);
operation4.plus();
f E
}
c hre
c A
Le résultat affiché :
8
bonjour
9.0
true
H & H: Research and Training 11 / 19
Exemple avec l’héritage
Considérons la classe Personne suivante
package org.eclipse.model;
public class Personne {
private String nom;
private String prenom;
public String getNom() {
return nom;
I c
}
ELH
public void setNom(String nom) {
U
}
this.nom = nom;
L MO
f E
hre
public String getPrenom() {
return prenom;
c
c A
}
public void setPrenom(String prenom) {
this.prenom = prenom;
}
@Override
public String toString() {
return "Personne [nom=" + nom + ", prenom=" + prenom + "]";
}
}
H & H: Research and Training 12 / 19
Exemple avec l’héritage
Java
La classe Etudiant qui hérite de la classe Personne
package org.eclipse.model;
public class Etudiant extends Personne {
I c
private String niveau;
ELH
U
MO
public String getNiveau() {
}
return niveau;
f E L
hre
public void setNiveau(String niveau) {
c
c A
this.niveau = niveau;
}
@Override
public String toString() {
return "Etudiant [niveau=" + niveau + ", toString()=" +
super.toString() + "]";
}
}
H & H: Research and Training 13 / 19
Exemple avec l’héritage
Java
La classe Vehicule
package org.eclipse.model;
public class Vehicule {
I c
private int marque;
ELH
U
MO
public int getMarque() {
}
return marque;
f E L
chre
c A
public void setMarque(int marque) {
}
this.marque = marque;
@Override
public String toString() {
return "Vehicule [marque=" + marque + "]";
}
}
H & H: Research and Training 14 / 19
Exemple avec l’héritage
Java
La classe Humain
package org.eclipse.model;
public class Humain <T> {
I c
ELH
U
MO
private T var;
f E L
hre
public T getVar() {
c
c A
return var;
}
public void setVar(T var) {
this.var = var;
}
}
H & H: Research and Training 15 / 19
Exemple avec l’héritage
Java
En testant le main suivant, aucun message d’erreur n’est signalé
package org.eclipse.test;
import org.eclipse.model.Etudiant;
I c
import org.eclipse.model.Humain;
ELH
import org.eclipse.model.Personne;
U
import org.eclipse.model.Vehicule;
L MO
r{e f E
c h
public class Main
c A void main(String[] args) {
public static
Humain<Personne> humain = new Humain();
Humain<Etudiant> humain2 = new Humain();
Humain<Vehicule> humain3 = new Humain();
}
}
H & H: Research and Training 16 / 19
Exemple avec l’héritage
Java
Modifions la classe Humain
package org.eclipse.model;
public class Humain <T extends Personne> {
I c
ELH
U
MO
private T var;
f E L
hre
public T getVar() {
c
c A
return var;
}
public void setVar(T var) {
this.var = var;
}
}
H & H: Research and Training 17 / 19
Exemple avec l’héritage
Java
On ne change rien dans le main
package org.eclipse.test;
import org.eclipse.model.Etudiant;
import org.eclipse.model.Humain;
I c
import
import
org.eclipse.model.Personne;
org.eclipse.model.Vehicule;
ELH
U
public class Main {
L MO
public static void
f E
hre
main(String[] args) {
Humain<Personne>
c humain = new Humain();
c A
Humain<Etudiant>
Humain<Vehicule>
humain2 = new Humain();
humain3 = new Humain();
}
}
H & H: Research and Training 18 / 19
Exemple avec l’héritage
Java
On ne change rien dans le main
package org.eclipse.test;
import org.eclipse.model.Etudiant;
import org.eclipse.model.Humain;
I c
import
import
org.eclipse.model.Personne;
org.eclipse.model.Vehicule;
ELH
U
public class Main {
L MO
public static void
f E
hre
main(String[] args) {
Humain<Personne>
c humain = new Humain();
c A
Humain<Etudiant>
Humain<Vehicule>
humain2 = new Humain();
humain3 = new Humain();
}
}
La dernière instruction sera soulignée en rouge car Vehicule n’hérite pas de la
classe Personne
H & H: Research and Training 18 / 19
Exemple avec l’héritage
Java
Pour les collections
I
c
<?> autorise tout H
EL les objets de la
<? extends Personne> autorise O U
seulement
L M
f Eautorise seulement les objets de la
classe Personne ou ceux dont la classe mère est Personne
h r e
c ou ceux qui ont la classe Personne comme
<? super Personne>
c A
classe Personne
classe fille
H & H: Research and Training 19 / 19