2016-03-22 7 views
4

varsayalım hata I m1(10,10) gibi m1() yöntemi ile iki int değerleri çağrı zamanAmbiguty ve uygun bir yöntem olup

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 
    } 
} 

aşağıdaki gibi bir aşırı sınıf olan aşırı Java hata bulundu

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); 
^ 

ve m1(10.5f,10.6f) gibi iki float değeriyle m1() yöntemini çağırdığımda

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) 

Neden herkes bunun nedenini açıklayabilir, neden bu program iki farklı hata türünü gösterir? Bir float beklediği bir yöntemle ilgilidir int bağımsız değişken geçmesi için çalışıyoruz

+0

Neden eşit hatalar beklediğini merak ediyorum? "Int", veri kaybına neden olan "daha düşük" veri türü olduğunda, derleyici _promote_ 'ın' int''sine nasıl geçmelidir? – Tom

+0

Yöntem alanı derleyicisinin çağırdığım yöntemleri bulamadığım için her iki yöntem için de uygun bir yöntem hatası beklenmediğini umuyordum –

+0

Ve neden her iki yöntemin de uygun olmadığını düşünüyorsunuz? int'? – Tom

cevap

5

, bağımsız değişken otomatik olarak (bir genişleyen ilkel dönüşüm bir sayısal değer genel büyüklüğü hakkında bilgi kaybetmeyen widening primitive conversion ile float için int çevrilebilmesi). Bu nedenle, her iki yöntem de t.m1(10,10) numaralı çağrıyı yürütebilir ve derleyici ikisi arasında seçim yapamaz (her ikisi de int'dan float'a argümanlardan birinin dönüşümünü gerektirdiğinden, iki yöntemin hiçbiri diğerinden daha uygun değildir. verilen argümanlar). Bu nedenle reference to m1 is ambiguous hatası. floatint kısaltılır zaman hassasiyet kaybı olacağını beri

bir int bekleyen yönteme bir float argüman geçiyoruz, argüman, int için açık döküm olmadan int dönüştürülebilir olamaz . Bu nedenle, yöntemlerin hiçbiri t.m1(10.5f,10.6f)'u çalıştıramaz.

+0

"veri kaybı olmadan int'den float'a dönüştürülür" Genel olarak (tüm inters için) bu doğru değildir. – Matthias

+0

@Matthias Haklısınız. Hatalıydım. Ben düzenleyeceğim – Eran

İlgili konular