JAV[ArrayList]

Fermé
MAX - 8 févr. 2005 à 21:30
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 - 11 févr. 2005 à 08:28
Bonjour ou bonsoir selon la reception de ma presente lettre.
Ce soir, comme dab, j'ai un petit probleme que rencontré dans un exercice de Java, le probleme est le suiant:

j'ai deux clsses, une classe derivée CompteEpargne qui herite de sa classe de base : Compte.
Selon le mecanisme de Java toutes ces deux classes heritent d'une maniere automatique de la super classe Object, et par prencipe de compatibilité amont on peut faire une collection des objets de deux classes, pour laquelle j'ai utilisé le tableau dynamique ArrayListe que j'appllé dans mon exercice ListeCompte, il s'agit donc d' un tableau qui regroupe une collection des objets qui peuvent etre de nature Compte ou CompteEpargne.

L'objectif est d'ecrure une methode: CALCULINTERET, qui parcourir la listCompte en calculant l'interet dans tous les CompteEpargne rencontrés, cachant que la methode CALCULINTERET est disponible dans la classe CompteEpargne; j'ai pas pu faire cette quetion, j'ai regardé la solution proposée dans le livre qui est la suivante:




public void calculeInteret()
{
for ( Iterator i = listeCompte.iterator () ; i.hasNext () ; )
{
Compte cpt ;
cpt = ((Compte)i.next ());
if ( cpt instanceof CompteEpargne )
( ( CompteEpargne) cpt) .calculeInteret();
}
}
J'ai compris la solution sauf la partie :


Compte cpt ;
cpt = ((Compte)i.next ());

j'ai pas compris cette partie de la procedure, pouriez vous m'aider.


Merci d'avance.
Max

1 réponse

choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
8 févr. 2005 à 22:46
Salut

c'est tout simple ...

i.next() te renvoie un objet courant dans la liste ...

le problème est qu'il faut désigner de quel type est cet objet ...

d'où le fait de signaler "Compte" entre parenthèses pour signaler que l'objet est du type "Compte", c'est ce que l'on appelle en Java le "Casting".
0
Salut
je vous rmerci sur ces clarifications claires et cibliées.


Cependant j'ai encor un petit souci:
Vous m'avez dit que la fonction i.next() me renvoie un objet courant dans la liste qu'il peut être de type Compte ou CompteEpargne, et le probleme reside dans le fait qu'il faut désigner de quel type appartien cet objet, d'ou interet de le transtyper, d'où le fait de signaler "Compte" entre parenthèses pour signaler que l'objet est du type "Compte".

Mais si est le cas :

1-c'est quoi le rôle du reste du corps c'est a dire:

( cpt instanceof CompteEpargne )

2-Si l'objet courant envoyé par la methode i.next() n'est pas de nature ou d'origine Compte, est -il possible de le caster en Compte??

3- est ce que le compilateur doit verifier avant de transtyper un objet la possibilité de transtypage?

Merci de bien vouloir repondre a mes bêtes questions.

Max.
0
1- un CompteEpargne est un cas particulier de Compte car la classe CompteEpargne hérite de Compte , donc on castant ton objet peut peut etre de type (plus precisement une instance de) CompteEpargne qui est un sous type de Compte d'ou la verification avec le instanceof

2- c ce que fait (Compte)i.next() .... non


3- oui il le verifie sinon il leve une exception de type ClassCastException

Av pluch
0
Merci, meric, merci, votre reponse claire et solide.


Mais la question que j'aimrai poser est la suivante:

pourquoi on cast l'objet courant envoyé par la methode next () en faisant : (Compte)i.next() avant de ferifier la possibilité de ce transtypage, car il est possible que cet objet ne désigne pas un objet de nature (dorigine) Compte, ou il ne paut etre en aucun cas un Compte.

Moi je trouve qu'en faisant la commende: (Compte)i.next() , on force le compilateur à traiter l'objet courant comme etant un compte, maime si ce n'est pas le cas.

Moi je pensse que la solution doit etre :

public void calculeInteret()
{
for ( Iterator i = listeCompte.iterator () ; i.hasNext () ; )
{
Compte cpt ;

if ( cpt instanceof CompteEpargne )
( ( CompteEpargne) cpt) .calculeInteret();
}
}

1-Comment trouvez vous cette propsition?
2-C'est quoi votre remarque ?
3-Cette solution est elle admissible? sinon pourquoi?

Merci infiniment.
0
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100 > kal
9 févr. 2005 à 10:27
1. non correcte
2. parce qu'aucun objet n'a été retiré de la liste, tu te contentes de faire voyager ton itérateur et le casting me paraît douteux ..
3. En général, le programmeur qui utilise des structures de données telles que les arraylist sait quand même ce qu'il y a de stocké dedans. On peut certainement faire jour l'héritage des classe mais on ne peut pas se contenter d'y mettre des objets génériques.

0
MAX > choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024
11 févr. 2005 à 05:36
Merci une autre fois sur vos reponses pertinentes.
Ma derniere question que je vous pose, si vous acceptez, est la suivante:

Si par exemple nous avons une liste dynamique constutiée des objets d'origines de types Compte, CompteEpargne et Personne, cachant que la classe personne n'herite pas de Compte ni de compteEpargne, la question est : est-ce-que la precedente solution est toujours admissible et correcte pour la nouvelle situation ?
Je vous reppel que la solution est la suivante:

public void calculeInteret()
{
for ( Iterator i = listeCompte.iterator () ; i.hasNext () ; )
{
Compte cpt ;
cpt = ((Compte)i.next ());
if ( cpt instanceof CompteEpargne )
( ( CompteEpargne) cpt) .calculeInteret();
}
}

Cette solution est-elle admissible pour ce nouveau contexte?
Sinon pourquoi?

Mercci d'avanc.
0