IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

[Compilateur] appel de méthodes avec signature similaire


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2003
    Messages : 66
    Points : 80
    Points
    80
    Par défaut [Compilateur] appel de méthodes avec signature similaire
    Je me suis rendu compte d'un petit truc étrange en Java.
    Si j'ai 2 méthode avec le même nom mais des paramètres différents qui sont des objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void truc(Integer b){
    }
     
    void truc(String a){
    }
    et que j'appèle la méthode truc(null). Java va sortir l'erreur "The method truc(Integer) is ambiguous for the type Test".
    Ok, c'est logique, il est impossible de savoir quel méthode appeler.

    Mais maintenant si une des 2 méthode à comme paramètre un Object :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static void truc(Object b){
        System.out.println("Object");
    }
     
    static void truc(String a){
        System.out.println("string");
    }
    l'appel de truc(null)ne créera aucune erreur de compilation et lors de l'exécution, la méthode truc(String) sera toujours appelée!

    Ma question est pourquoi quand une des méthodes à comme paramètre un Object il n'y a pas d'erreur de compilation et est-ce que cela fonctionne de la même façon sur toutes les JVM?

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : mai 2004
    Messages : 2 076
    Points : 2 329
    Points
    2 329
    Par défaut
    Non pour moi c'est normal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public class Test {
     
    	public static void main(String[] args) {
    		Meuh meuh = new Meuh();
    		Meuh2 meuh2 = new Meuh2();
    		Meuh3 meuh3 = new Meuh3();
    		Object obj = new Object();
    		truc(obj);
    		truc(meuh);
    		truc(meuh2);
    		truc(meuh3);
    		truc(null);
    	}
     
    	static void truc(Object b){
    				System.out.println("Object");
    			}
     
    	static void truc(Meuh a){
    				System.out.println("Meuh");
    			}
     
    	static void truc(Meuh2 a){
    				System.out.println("Meuh2");
    			} 
     
    //	static void truc(Meuh3 a){
    //				System.out.println("Meuh3");
    //			} 
    }
    Avec Meuh2 et Meuh3 héritant de Meuh, qui est une classe vide.

    on remarquera que l'output donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Object
    Meuh
    Meuh2
    Meuh
    Meuh2
    Donc java prend la signature la plus surchargée d'office. S'il a le choix entre 2 signatures autant surchargées (si on décommente la dernière méthode truc par exemple), le compilateur signale l'ambiguïté.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    mars 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2005
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Ce que veut dire nuke est que String étant une sous classe d'Object il n'y a pas d'ambiguïté dans ton deuxième exemple contrairement au premier.

  4. #4
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : mai 2004
    Messages : 2 076
    Points : 2 329
    Points
    2 329
    Par défaut
    Mdr j'ai oublié la conclusion de mes tests et de ma démonstration !! Mais c'était bien ça.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2003
    Messages : 66
    Points : 80
    Points
    80
    Par défaut
    J'ai tout compris merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB6]appel de dll en C avec paramètres
    Par SerLab dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/02/2006, 15h49
  2. Réponses: 8
    Dernier message: 02/02/2006, 19h13
  3. appel d'un module externe avec argument en entree
    Par oursblanc dans le forum Modules
    Réponses: 6
    Dernier message: 21/10/2005, 00h16
  4. Appeler une API sans liaison avec une DLL
    Par mat.M dans le forum x86 32-bits / 64-bits
    Réponses: 10
    Dernier message: 13/07/2004, 03h22
  5. Réponses: 3
    Dernier message: 20/12/2003, 20h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo