Comme @Joachim Sauer correctly points out: La spécification JVM pose moins de contraintes sur la surcharge de méthode dans le bytecode que ne le fait JLS sur les programmes Java.
De l'JVM Specification (Section 4.6, Methods):
Pas deux méthodes dans un fichier de classe peut avoir le même nom et descripteur (§4.3.3).
Et un descripteur de méthode inclut le type de retour: (4.3.3 Method Descriptors)
MethodDescriptor:
(ParameterDescriptor*) ReturnDescriptor
Les méthodes que vous mentionnez dans votre question ont tous les descripteurs distincts , alors ils vont bien:
public final void a(ak aa) -> (Lsomepkg1/ak;)V
public final void a(cn ccn) -> (Lsomepkg2/ccn;)V
public final cN a() -> ()Lsomepkg3/cN;
public final void a() -> ()V
public final boolean a() -> ()Z
Ceci est intelligemment exploité par les obfuscateurs. Un programme bytecode valide n'a plus de programme Java "correspondant directement". ProGuard fait cela par exemple. Voici un extrait de leur manuel:
-overloadaggressively
Indique à appliquer une surcharge agressive tout en obscurcissant. Plusieurs champs et méthodes peuvent ensuite obtenir les mêmes noms, tant que leurs arguments et leurs types de retour sont différents (pas seulement leurs arguments).
Il existe d'autres techniques similaires utilisant par exemple l'instruction bytecode jsr
ou utilisant des identifiants de variables qui sont des mots réservés dans le langage Java. Here est une page Web énumérant quelques techniques.
Pour répondre à la question de suivi évidente: Comment la machine virtuelle Java sait-elle quelle méthode appeler sur le site d'appel? Les instructions invoke requièrent que vous spécifiez une référence à une signature de méthode complète (y compris le type de retour de la méthode) à appeler.
Vous avez montré 5 méthodes - quelle signature de méthode vous dérange? –
Vous posez des questions sur les types de retour surchargés (trois derniers)? –
Je veux dire trois derniers, le type 'return' n'est pas inclus dans la signature de la méthode, donc ces méthodes sont en double, n'est-ce pas? – secmask