2016-03-22 12 views
4

Angenommen, ich habe einen überlasteten Klasse wie untenAmbiguty und keine geeignete Methode Fehler in Java gefunden Überlastung

class Test{ 
    public void m1(int a,float b){ 
     System.out.println("hello"); 
    } 
    public void m1(float a,int b){ 
     System.out.println("hai"); 
    } 
    public static void main(String[] args){ 
     Test t = new Test(); 
     t.m1(10,10);//error 
     t.m1(10.5f,10.6f);//error 
    } 
} 

wenn ich rufe m1() Methode mit zwei int Werte wie m1(10,10) der Fehler

error: reference to m1 is ambiguous, both method m1(int,float) in Test and method m1(float,int) in Test match 
t.m1(10,10); 
^ 

ist und wenn ich rufe m1() Methode mit zwei Float-Werte wie m1(10.5f,10.6f) Fehler ist

error: no suitable method found for m1(float,float) 
t.m1(10.5f,10.6f); 
^ 
method Test.m1(float,int) is not applicable 
    (actual argument float cannot be converted to int by method invocation conversion) 
method Test.m1(int,float) is not applicable 
    (actual argument float cannot be converted to int by method invocation conversion) 

Kann jemand bitte den Grund erklären, warum dieses Programm zwei verschiedene Arten von Fehlern zeigt?

+0

Ich frage mich, warum Sie gleich Fehler erwarten? Wie sollte der Compiler _promote_ "float" zu einem "int" sein, wenn "int" der "niedere" Datentyp ist, der Datenverlust verursacht? – Tom

+0

Ich dachte im Methodenbereich Compiler nicht gefunden die Methoden, die ich anrufe, so erwartete ich 'keine geeignete Methode Fehler' für beide Methodenaufrufe –

+0

Und warum denkst du, dass beide Methoden nicht geeignet sind, wenn Sie sie mit ' int'? – Tom

Antwort

5

Wenn Sie versuchen, ein int Argument an eine Methode zu übergeben, die ein float erwartet, kann das Argument automatisch von int zu float über widening primitive conversion (eine Verbreiterung primitive Umwandlung verliert keine Informationen über die Gesamtgröße eines numerischen Wert umgewandelt werden). Daher können beide Methoden den Aufruf t.m1(10,10) ausführen, und der Compiler kann nicht zwischen den beiden wählen (da beide eine Konvertierung von einem der Argumente von int zu float erfordern, so dass keine der beiden Methoden für die gegebene Argumente). Daher der reference to m1 is ambiguous Fehler.

Wenn Sie ein float Argument ein Verfahren unterwegs sind, die ein int erwartet, kann das Argument nicht zu int ohne explizite Umwandlung zu int umgewandelt werden, da es zu einem Verlust an Präzision wäre, wenn die float zu int abgeschnitten . Daher kann keine Ihrer Methoden t.m1(10.5f,10.6f) ausführen.

+0

"konvertiert von int in float ohne Datenverlust" Im Allgemeinen (für alle Ints) ist dies nicht korrekt. – Matthias

+0

@Matthias Sie haben Recht. Ich war ungenau. Ich werde bearbeiten. – Eran

Verwandte Themen