Interfaces

Un type est caractérisé par l'ensemble des méthodes qui s'appliquent aux objets possédant ce type (un objet peut avoir plusieurs types), ou qui acceptent ces objets comme paramètre.
L'utilisation correcte d'un type sera testée soit au moment de la compilation (vérification statique) soit au moment de l'exécution (vérification dynamique). Certains langages, comme Scheme, sont surtout basés sur la vérification dynamique, d'autres comme Java ou C sur la vérification statique.
Pouvoir créer un type indépendemment d'une implémentation est une nécessité pour pouvoir faire du polymorphisme, c'est à dire manipuler des objets ayant des implémentations différentes dans un même traitement. En effet, il est nécessaire pour cela de garantir que ces objets sont manipulables par des méthodes communes. Java répond à ce besoin grâce aux interfaces.
Une interface décrit un ensemble de méthodes sans en donner d'implémentation (on parle aussi de classe abstraire pure). Par exemple :
public interface Comparable {
    public int compareTo(Object o);
}
permet de typer des objets comme étant comparables, c'est à dire disposant d'une méthode compareTo(Object) qui renvoie un entier. Cet exemple est en fait tiré du paquetage java.lang et le résultat de o.compareTo(o2) est positif, null ou négatif selon que o est supérieur strictement, égal ou inférieur strictement à o2.
Pour que les objets instances d'une classe possèdent le type décrit par une interface, la classe doit être déclarée comme implémentant l'interface, à l'aide du mot-clé implements. Par exemple :
public class Integer implements Comparable {
    ...
    public int compareTo(Object o) {
        return compareTo((Integer)o);
    }

    public int compareTo(Integer anotherInteger) {
        int thisVal = this.value;
        int anotherVal = anotherInteger.value;
        return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
    }
    ...
}
Remarque : implémenter uniquement compareTo(Integer) dans Integer sera refusé par le compilateur. En effet, la méthode compareTo() telle qu'elle est déclarée dans Comparable accepte comme paramètre n'importe quel Object. Il est donc impossible de se limiter aux Integer.