2014-04-29 5 views
5

Ich habe versucht, folgenden Code zu kompilieren, aber erhielt FehlerMehrdeutigkeit Fehler während Überlastung var args Methode und Wrapper-Methoden in Java

static void test(long... x) 
{ 
    System.out.println("long..."); 
} 

static void test(Integer... x) 
{ 
    System.out.println("Integer..."); 
} 

public static void main(String [] args) { 
    int no=5; 
    test(no,no);//getting error at this point in eclipse 'The method test(long[]) is ambiguous ' 
} 

ich donot wissen, warum es nicht eindeutig ist. bedeutet, wenn ich einen int Wert übergebe es sollte Auto-Box und test(Integer..x) sollte aufgerufen werden..auf ähnliche Linie test(long..x) sollte aufgerufen werden..das ist mein Verständnis..kann jemand erklären, warum es mehrdeutig ist?

+0

Welche JDK-Version verwenden Sie? Und was passiert, wenn Sie es von der Kommandozeile aus kompilieren? Bitte überprüfen Sie, ob Sie nicht davon gebissen sind: http://stackoverflow.com/a/7689819/2231632 – prabugp

Antwort

2

Variable arity kommt zuletzt die spezifischste Verfahren bei der Bestimmung. Die Regeln zu bestimmen, welche Vararg Methode wird angewendet, wenn es mehrere sind definiert in JLS 15.12.2.4 - hier ein Auszug:

Eine Variable arity Mitglied Methode mit dem Namen m ist spezifischer als andere variable arity Member-Methode mit dem gleichen Namen, wenn entweder:

  • [...]
  • Ein Mitglied Methode hat k-Parameter und die anderen n-Parameter, wobei n ≥ k, und:

Die Typen der Parameter der ersten Methode sind U1, ..., Uk-1, Uk []. Die Typen der Parameter der anderen Methode sind T1, ..., Tn-1, Tn []. Für alle j von 1 bis n, Uj <: Tj In Ihrem Fall, k = n, und U1 [] = int [] und T1 [] = long [] so kann die Bestimmung erfolgen, wenn int <: lang oder das Gegenteil.

Mit anderen Worten, der Typ, der berücksichtigt wird, ist nicht int [] vs. long [] , sondern int vs long. Und es passiert, dass Int <: lang so die int ... Methode sollte gewählt werden und es sollte kompilieren.


Fazit:

Der Code sollte (und nicht) kompilieren gut mit Java 7, aber nicht mit Java 5 oder 6. Der folgende Code druckt int mit Java 7 kompilieren:

public class Test1 { 
    public static void main(String[] args) { 
     new Test1().m(1, 2); 
    } 
    int m(int... i) { 
     System.out.println("int"); 
     return 0; 
    } 
    long m(long... i) { 
     System.out.println("long"); 
     return 0; 
    } 
} 
+0

Was ist mit 'm (Integer ... i)' was ist in OP Frage? [Das wird nicht kompilieren ...] (http://ideone.com/JTrTYq) und [hier ist der Grund.] (Http://stackoverflow.com/a/23364636/1686291) –

Verwandte Themen