2017-09-16 1 views
-1
public class CompilerConfuse { 

    public static void main(String[] args) { 

     A a =new A(); 
     a.method(null); // error line 

    } 

} 


class A 
{ 

    public void method(Integer a) 
    { 
     System.out.println("In Integer argument method" + a); 
    } 

    public void method(Object a) 
    { 
     System.out.println("In Object argument method" + a); 
    } 

    public void method(String a) 
    { 
     System.out.println("In String argument method " + a); 
    } 
} 

En méthode Integer et String overload, le compilateur n'a pas pu décider lequel appeler. Pourquoi cela?Pourquoi le compilateur est-il confondu dans la compilation du code Java

Si nous supprimons une méthode de surcharge String ou Integer, cela ne génère pas d'erreur lors du passage de null.

+1

Quelle surcharge pensez-vous qu'il va utiliser? Ceci * est * ambigu. – Carcigenicate

Répondre

-1

Le compilateur sélectionne la méthode la plus spécifique en fonction du type d'argument (s) transmis.
Dans votre cas, String et Integer sont plus spécifiques que Object mais les deux sont aussi spécifiques, donc le compilateur ne choisit pas entre et émet une erreur de compilation.

Vous pouvez consulter 15.12.2.5. Choosing the Most Specific Method:

Il est possible qu'aucune méthode est la plus spécifique, parce qu'il ya deux ou plusieurs méthodes qui sont au maximum spécifiques. Dans ce cas:

Si toutes les méthodes spécifiques au maximum ont des signatures de remplacement équivalent (§8.4.2), puis:

...

Sinon, l'appel de méthode est ambiguë, et une erreur de compilation se produit.