3 votes

Casting de la classe d'un objet

Mon expérience de la POO s'est faite avec Objective-C (qui est typée dynamiquement), mais je suis en train d'apprendre Java. Je souhaite itérer sur une liste d'objets (ArrayList) et exécuter une certaine méthode sur ces objets. Tous les objets de la liste sont de la même classe. En Objective-C, je vérifierais simplement à chaque itération que l'objet est de la bonne classe, puis j'exécuterais la méthode, mais cette technique n'est pas possible en Java :

for (Object apple : apples) {
        if (apple.getClass() == Apple.class) {
            apple.doSomething(); //Generates error: cannot find symbol
        }
    }

Comment "indiquer" au compilateur la classe à laquelle appartiennent les objets de la liste de tableaux ?

10voto

danben Points 35312

Dans Java 5 et les versions ultérieures, les types de collection sont générés. Vous auriez donc ceci :

ArrayList<Apple> a = getAppleList(); // list initializer

for (Apple apple : a) {
    apple.doSomething();
}

En règle générale, il n'est pas souhaitable d'avoir ArrayList s de Object à moins que vous n'ayez spécifiquement besoin de votre ArrayList pour pouvoir contenir différents types de Objects . En général, ce n'est pas le cas, et vous pouvez utiliser des collections hétérogènes pour améliorer la sécurité des types.

5voto

akf Points 23518

Pour la distribution traditionnelle, considérez ceci :

for (Object apple : apples) {
    if (apple instanceof Apple) { //performs the test you are approximating
        ((Apple)apple).doSomething(); //does the cast
    }
}

dans les versions ultérieures de Java, Génériques ont été introduites pour éviter la nécessité de ce type de tests.

1voto

meriton Points 30447

Lire l'article section sur le casting du Tutoriel Java devrait répondre à cette question.

(Ou, si vous déclarez la liste de tableaux vous-même, utilisez un paramètre de type approprié, comme le suggère danben).

0voto

Erkan Haspulat Points 4707

Vous devez lancer Object pomme à Apple .

((Apple)apple).doSomething();

Mais dans ce cas précis, il est préférable d'utiliser ;

for(Apple apple : apples){
    apple.doSomething();
}

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