[Java] méthodes identique sauf type de retour
Résolu/Fermé
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
-
3 oct. 2011 à 21:06
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 4 oct. 2011 à 15:58
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 4 oct. 2011 à 15:58
A voir également:
- [Java] méthodes identique sauf type de retour
- Waptrick java football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Bible java - Forum Téléchargement
- Retour a la ligne chatgpt - Forum Réseaux sociaux
- Jeux java football - Télécharger - Jeux vidéo
1 réponse
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 014
Modifié par KX le 4/10/2011 à 16:10
Modifié par KX le 4/10/2011 à 16:10
Bon après avoir parlé de ce comportement à un collègue, on a trouvé le "problème".
C'est en fait un "effet de bord" de l'héritage en Java.
En effet dans une classe fille on peut surcharger une méthode en lui donnant un type de retour qui hérite du type de retour de la méthode initiale. On a ainsi deux méthodes avec même nom, même paramètres, et types de retours différents (...mais compatibles !)
Or Java considère la classe fille comme declaringClass des deux méthodes au lieu d'attribuer la première à la classe mère, et la deuxième à la classe fille.
On se retrouve donc avec plusieurs fois "la même" méthode dans la classe fille !
NB. Ce comportement doit aussi se retrouver avec de l'implémentation d'interfaces.
Exemple :
C'est en fait un "effet de bord" de l'héritage en Java.
En effet dans une classe fille on peut surcharger une méthode en lui donnant un type de retour qui hérite du type de retour de la méthode initiale. On a ainsi deux méthodes avec même nom, même paramètres, et types de retours différents (...mais compatibles !)
Or Java considère la classe fille comme declaringClass des deux méthodes au lieu d'attribuer la première à la classe mère, et la deuxième à la classe fille.
On se retrouve donc avec plusieurs fois "la même" méthode dans la classe fille !
NB. Ce comportement doit aussi se retrouver avec de l'implémentation d'interfaces.
Exemple :
//---------
class RetourA {}
class ClasseX
{
public RetourA methode()
{
return null;
}
}
//---------
class RetourB extends RetourA {}
class ClasseY extends ClasseX
{
@Override
public RetourB methode()
{
return null;
}
}
//---------
public class Test
{
public static void main(String...args)
{
for (java.lang.reflect.Method m : ClasseY.class.getMethods())
System.out.println(m.toGenericString());
}
}
/*
public RetourB ClasseY.methode()
public RetourA ClasseY.methode() // En réalité, ici c'est ClasseX.methode() !!!
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class<?> java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
*/
La confiance n'exclut pas le contrôle