2 votes

Déclaration d'un tableau Java comme { A[] aa = new B[10]}

Aujourd'hui, j'ai écrit un simple test sur la syntaxe de déclaration des tableaux, il y a donc 3 classes :

public class A {
}

public class B extends A {
}

public class C extends A {
}

et j'ai essayé de créer un tableau en utilisant la syntaxe suivante

A[] aa = new B[10];

C'est donc possible, mais nous ne pouvons ajouter que des instances de la classe B à ce tableau, si vous essayez d'ajouter des instances de A o C vous recevez java.lang.ArrayStoreException Et la question, pourquoi peut-on créer un tableau en utilisant une telle syntaxe et où peut-on l'utiliser et en tirer profit ? Je vous remercie.

4voto

Tom Tresansky Points 5423

Le tableau contient des types B. Même si la référence aa pourrait contenir des tableaux de type A[], B[] ou C[], (puisque C et B étendent tous deux A), au moment de l'exécution, le tableau ne peut contenir que des éléments de type Bs.

La classe A n'est pas un B. La classe C n'est pas un B. D'où l'exception d'exécution.

EDITAR:

Ce type de code peut être utilisé à de nombreuses fins. Par exemple, vous pouvez déclarer un tableau de cette manière parce que vous pourriez ne pas savoir avant l'exécution le type plus explicite avec lequel vous travaillez.

Par exemple :

Animal[] animals;
if (useDogs) {
 animals = new Dog[num];
} else {
 animals = new Cat[num];
}

loadIntoCar(animals);

3voto

Ted Hopp Points 122617

La raison pour laquelle cette syntaxe est autorisée dans le langage est que, parfois, vous ne vous souciez pas de la sous-classe des objets contenus dans le tableau. Le tableau Règles de spécification du langage Java pour le sous-typage des tableaux :

Si S y T sont tous deux des types de référence, alors S[] > 1 T[] si S > 1 T .

(où > 1 signifie "sous-type direct").

Cela permet d'écrire une méthode comme celle-ci :

public void printArray(Object[] array) {
    System.out.print('[');
    boolean first = true;
    for (Object obj : array) {
        if (!first) {
            System.out.print(", ");
        } else {
            first = false;
        }
        System.out.print(String.valueOf(obj));
    }
    System.out.print(']');
}

et l'appeler avec :

String[] foo = { "a", "b", "c" };
printArray(foo);

Cette caractéristique du langage a pour effet malheureux de reporter les problèmes d'exception ArrayStoreException au moment de l'exécution.

0voto

Olivier Croisier Points 2759

Les types de tableaux sont covariant ce qui signifie que vous pouvez déclarer A[] a = new B[] (les collections, au contraire, ne le sont pas : vous ne pouvez pas déclarer List<A> a = new List<B>()).

C'est pourquoi le compilateur ne peut pas vérifier de manière préemptive que vous ne placerez que des éléments d'un type valide dans le tableau, ce qui explique pourquoi la vérification n'a lieu qu'au moment de l'exécution, lorsque vous essayez d'insérer un élément dans le tableau.

0voto

Anthony Accioly Points 10501

Si vous voulez des exemples, jetez un coup d'œil à Tableaux . Si Java ne permettait pas le polymorphisme des tableaux, nous ne pourrions pas avoir des fonctionnalités telles que sort(Object[] a) , toString(Object[] a) , binarySearch(Object[] a, Object key) , etc. Rappelons que B et C sont des sous-types de Object vous pouvez donc utiliser cette fonctionnalité pour chacun d'entre eux. Notez que les tableaux sont antérieurs aux génériques (Java 1.5.0) et que même les génériques ont leurs défauts (la contrepartie pour Java est que vous ne pouvez pas connaître le type générique à l'exécution à cause de l'effacement de type).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X