2016-05-22 2 views
2
public class Test { 

public static void main(String[] args) throws ClassNotFoundException { 


    new Test().f("dfffg"); // it is running perfectly 
    new Test().f(1, 1);  // it is giving ambiguity 
} 

public void f(int a,long b){ 
    System.out.println("in int and long"); 
} 

public void f(long a,int b){ 
    System.out.println("in long and int"); 
} 

public void f(String s) { 
    System.out.println("in String"); 

} 


public void f(StringBuffer o) { 
    System.out.println("in String bufer"); 

} 

public void f(Object o){ 
    System.out.println("in object"); 
} 
} 

, wenn ich dies ausführen new Test().f("dfffg"); es läuft perfekt, obwohl wir überladene Methode mit String und Objekt als Parameter habenüberlastet: Ambigutiy während die Parameter sind primitiv, aber nicht, wenn es Referenztyp ist

während f (1, 1) Mehrdeutigkeit geben, die ich verstehen kann.

+0

int kann zu long hochgestuft werden, wenn kein übereinstimmender Datentyp gefunden wird. Dies verursacht eine Funktionsmehrdeutigkeit. Wenn Sie beide Funktionen verwenden möchten, können Sie Funktionen wie f (int ... a) und f (long ... a) verwenden. Dies sind keine Lösungen für Ihr Problem, können aber zur Lösung von Mehrdeutigkeiten beitragen. –

Antwort

1

new Test().f("dfffg") entspricht den Signaturen von public void f(String s) und public void f(Object o). Wenn Sie einen Objektparameter übergeben, wird die Methode mit dem spezifischsten Argumenttyp ausgewählt: in diesem Fall public void f(String s). String ist spezifischer als Object seit String ist eine Unterklasse von Object.

public void f(StringBuffer o) ist in diesem Beispiel nicht relevant, da ein StringBuffer keine Super-Klasse von String ist, so kann man nicht ein String an eine Methode übergeben, die ein StringBuffer erwartet.

+0

Gotcha .... Was ist mit f (StringBuffer s) ?? – sparsh610

+0

@ sparsh610 Ich habe gerade die Antwort bearbeitet, um das zu erklären. – Eran

Verwandte Themen