Voici une utilisation d'une interface et du sous-typage pour représenter tous les arbres, même l'arbre vide, par des objets. On commence par définir un type abstrait ArbreBinaire, puis deux sous-types concrets, un pour les arbres non-vides, et un pour les arbres vides :
interface ArbreBinaire {
boolean estVide();
}
class AVide implements ArbreBinaire {
public boolean estVide() {
return true;
}
}
class ACons implements ArbreBinaire {
int étiquette;
ArbreBinaire gauche, droit;
ACons(int étiquette,
ArbreBinaire gauche,
ArbreBinaire droit) {
this.étiquette = étiquette;
this.gauche = gauche;
this.droit = droit;
}
public boolean estVide() {
return false;
}
}
On remarquera que la classe ACons n'est plus directement auto-référencée : les champs gauche et droit ne sont pas de type ACons, mais ArbreBinaire, de manière à permettre à un sous-arbre d'être vide. Une application pourra déclarer une variable a de type abstrait ArbreBinaire, et pourra l'initialiser à l'aide des constructeurs des classes concrètes :
ArbreBinaire a =
new ACons(1,
new ACons(2, new AVide(), new AVide()),
new ACons(3, new AVide(), new AVide()));
L'exécution de l'appel a.estVide() conduit à invoquer la méthode estVide de ACons, qui retourne false.