0% ont trouvé ce document utile (0 vote)
176 vues23 pages

Java : Introduction à la Généricité

Ce document présente la généricité en Java à travers plusieurs exemples. Il introduit d'abord le concept de classe générique avec un type générique, puis montre comment instancier une telle classe avec des types différents. Il présente ensuite un exemple avec deux types génériques et un autre avec plusieurs attributs du même type générique.

Transféré par

losus007
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
176 vues23 pages

Java : Introduction à la Généricité

Ce document présente la généricité en Java à travers plusieurs exemples. Il introduit d'abord le concept de classe générique avec un type générique, puis montre comment instancier une telle classe avec des types différents. Il présente ensuite un exemple avec deux types génériques et un autre avec plusieurs attributs du même type générique.

Transféré par

losus007
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 23

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

Vous aimerez peut-être aussi