[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
Bonjour,

Pour faire quelques tests je viens de générer automatiquement toute une liste de méthodes.
Et je repère ce qui pour moi sont des "irrégularités" du langage, que j'aimerais comprendre et éventuellement reproduire, puisqu'il s'agit d'avoir dans une même classe deux méthodes de même nom avec les mêmes paramètres mais qui renvoient deux types différents :

for (Method m : java.nio.CharBuffer.class.getMethods())
    System.out.println(m.toGenericString());

Pour CharBuffer par exemple, il faut regarder les 6 méthodes append, et les 2 méthodes array()

public Appendable append(CharSequence) throws IOException
public CharBuffer append(CharSequence)

public Appendable append(CharSequence,int,int) throws IOException
public CharBuffer append(CharSequence,int,int)

public Appendable append(char) throws IOException
public CharBuffer append(char)

public final char[] array()
public Object array()

Je vois bien qu'il y a le mot-clé final ou throws qui les modifie un petit peu, mais je n'arrive pas à reproduire ce comportement sans qu'Eclipse ne voit rouge (Duplicate method toto() in type)

public final char[] toto()
{
	return new char[10];
}

public Object toto()
{
	return null;
}

public String toto() throws Exception
{
	throw new Exception();
	return "";
}

Quelqu'un s'y connaîtrait-il assez pour m'expliquer ce comportement ?
Merci bien ;-)
A voir également:

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 015
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 :

//---------

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
2