Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Transtypage dynamique en Java

3 réponses
Avatar
nhourdeau
Bonjour,

J'ai un probleme avec le transtypage avec Java :

J'ai cree une classe generique CelluleChainee, utilisee par une classe
generique ListeChainnee :
la classe CelluleChainee a la structure suivante :

Field Summary
private java.lang.Object donnee La donnee de la cellule
private CelluleChainee suivant Cellule suivante

Constructor Summary
CelluleChainee() Constructeur par defaut
CelluleChainee(java.lang.Object donnee) Constructeur avec donnee

Method Summary
boolean equals(CelluleChainee cellule) Comparaison des donnees de 2
cellules.
void finalize() Destructeur
java.lang.Object getDonnee() Accesseur en lecture sur la donnee
CelluleChainee getSuivant() Accesseur en lecture sur la cellule
suivante
void raz() Remise a zero de la cellule
void setDonnee(java.lang.Object donnee) Accesseur en ecriture sur la
donnee
void setSuivant(CelluleChainee s) Accesseur en ecriture sur la
cellule suivante
java.lang.String toString() Mise sous forme de chaine pour affichage

J'utilise comme donnee un objet de la classe Sommet :

Field Summary
private ListeChainee aretes Liste chainee d'aretes liees au sommet
private java.lang.Object donnee Objet valeur du sommet

Constructor Summary
Sommet() Constructeur par defaut
Sommet(java.lang.Object o) Constructeur

Method Summary
void addArete(java.lang.Object s) Accesseur en ecriture sur les
adjacents (ajout arete).
void clearAretes() Accesseur en ecriture sur les adjacents (remise a
zero).
boolean equals(Sommet s) Compare 2 Sommets par rapport a leur donnee
ListeChainee getAretes() Accesseur en lecture sur la liste des
adjacents.
java.lang.Object getDonnee() Accesseur en lecture sur la donnee du
sommet.
Arete rechercheArete(java.lang.Object s) Recherche d'une arete
suivant un sommet cible.
void setDonnee(java.lang.Object o) Accesseur en ecriture sur la
donnee.
void supprArete(java.lang.Object s) Accesseur en ecriture sur les
adjacents (suppression arete).
java.lang.String toString() Mise sous forme de chaine pour affichage

Je souhaite comparer 2 cellules de Sommet entre elles : mais Java
n'appelle jamais la methode equals de Sommet avec l'instruction
suivante donnee.equals(cellule.donnee) 'donnee et cellule.donnee etant
de type Sommet
En fait la seule solution serait de caster en dur en mettant (Sommet)
avant chaque objet. Mais ce n'est pas tres pratique pour une classe
generique. Auriez-vous une solution ?

PS : desole pour ce long message mais il n'y a pas de systeme de
pieces jointes

Merci d'avance pour votre reponse
Nicolas HOURDEAU

3 réponses

Avatar
Isammoc
Method Summary
boolean equals(CelluleChainee cellule) Comparaison des donnees
de 2


mouais, pas génial de surcharger equals, vaut mieux redéfinir la
méthode...
Donc faire:
<code>
public void equals(Object o)
{
if(o instanceof CelluleChainee)
{
cellule = (CelluleChainee) o;
// ton code...
}
return false;
}
</code>


boolean equals(Sommet s) Compare 2 Sommets par rapport a leur
donnee ListeChainee getAretes() Accesseur en lecture sur la


de meme...


Je souhaite comparer 2 cellules de Sommet entre elles : mais Java
n'appelle jamais la methode equals de Sommet avec l'instruction
suivante donnee.equals(cellule.donnee) 'donnee et cellule.donnee etant
de type Sommet
En fait la seule solution serait de caster en dur en mettant (Sommet)
avant chaque objet. Mais ce n'est pas tres pratique pour une classe
generique. Auriez-vous une solution ?


oups, j'ai résolu ton problème sans le vouloir...
menfin, en tout cas, si donnee est un Object, il faudra le caster tout de
meme...

à moins que tu fasses une méthode de Sommet:

public static equals(Object o1, Object o2)
{
if( (o1 instanceof Sommet) && (o2 instanceof Sommet) )
{
Sommet s1 = (Sommet) o1;
Sommet s2 = (Sommet) o2;
// ton code pour les comparer
}
return false;
}

PS : desole pour ce long message mais il n'y a pas de systeme de
pieces jointes

Merci d'avance pour votre reponse
Nicolas HOURDEAU



De rien...

--
Isammoc

Avatar
nhourdeau
Bonjour,

Merci pour votre aide Isammoc, j'ai reussi a resoudre mon pb en
surchargeant equals bien :
en suivant le prototype public boolean equals(Object o) et en
utilisant instanceof comme vous me l'avez suggere. En fait j'avais mal
surcharge la methode en mettant directement le type de l'objet en
argument.

Isammoc <Isammoc(no-spam)@wanadoo.fr> wrote in message
mouais, pas génial de surcharger equals, vaut mieux redéfinir la
méthode...


En fait j'utilise la methode equals de Object car c la seule qui soit
universelle, si j'utilise l'interface Comparator dans les Objects de
CelluleChainnee, je ne peux pas mettre directement compareTo dans la
methode de comparaison de CelluleChainee >> Javac me jette en me
disant compareTo not a method in Object

Nicolas HOURDEAU

Avatar
Isammoc
(Nicolas Hourdeau) écrivait
news::

Bonjour,

Merci pour votre aide Isammoc, j'ai reussi a resoudre mon pb en
surchargeant equals bien :
en suivant le prototype public boolean equals(Object o) et en
utilisant instanceof comme vous me l'avez suggere. En fait j'avais mal
surcharge la methode en mettant directement le type de l'objet en
argument.

Isammoc <Isammoc(no-spam)@wanadoo.fr> wrote in message
mouais, pas génial de surcharger equals, vaut mieux redéfinir la
méthode...


En fait j'utilise la methode equals de Object car c la seule qui soit
universelle, si j'utilise l'interface Comparator dans les Objects de
CelluleChainnee, je ne peux pas mettre directement compareTo dans la
methode de comparaison de CelluleChainee >> Javac me jette en me
disant compareTo not a method in Object


C'est pas ce que je voulais dire:

surcharger : faire une méthode du même nom mais avec des paramètres
différents,
redéfinir: faire exactement le même prototypage, pour que ce soit la
méthode appelée.


Nicolas HOURDEAU