Si t et t' sont des types de références, et si t est un sous-type de t', alors est un sous-type de . Par exemple, un tableau de PointColore peut être affecté à une variable de type Point. Cette affectation ne transforme cependant pas le tableau de PointColore en un tableau de Point. Ainsi, si l'on tente d'affecter à l'un de ses éléments une instance de Point, l'exception ArrayStoreException est déclenchée :
class Point { int x, y; } class PointColore extends Point { java.awt.Color couleur; } class Test { public static void main(String[] args) { Point[] tp = new PointColore[4]; tp[0] = new Point(); // ERREUR : ArrayStoreException } }
En effet, un Point ne peut pas être affecté à un PointColore. Cette situation échappe au typage statique : le compilateur accepte ce programme, puisque la variable tp[0] est de type Point et le membre droit de l'affectation est du même type. La possibilité de cette erreur impose une vérification par la Machine Virtuelle Java, du type de la valeur affectée aux éléments d'un tableau de références.
Signalons que le sous-typage des tableaux ne concerne que les types de références et non les types primitifs : un tableau de byte ne peut pas être affecté à une variable de type int[].