SORU
9 EYLÜL 2015, ÇARŞAMBA


Neden derleyici bir char için varargs char aşırı bir int aşırı tercih ediyor?

Kod

public class TestOverload {

    public TestOverload(int i){System.out.println("Int");}
    public TestOverload(char... c){System.out.println("char");}

    public static void main(String[] args) {
        new TestOverload('a');
        new TestOverload(65);
    }
}

Çıktı

Int
Int

Beklenen davranışlar mı? Eğer öyleyse, o zaman neden? Bekliyorum: char, İnt

Not: Java 8 kullanıyorum

CEVAP
9 EYLÜL 2015, ÇARŞAMBA


Varargs (...) yöntem derleyici hangisini seçeceğimi belirlerken en düşük önceliğe sahiptir. Bu nedenle TestOverload(int i) tercih TestOverload(char... c) sana TestOverload Bir tek char parametre 'a' beri char olabilir otomatik olarak terfi için bir int.

JLS 15.12.2 :

  1. Birinci aşama (§15.12.2.2) aşırı çözümleme gerçekleştiririzin olmadanveya dönüşüm boks kutulama, veyadeğişken parametre kullanımı yöntem çağırma. Eğer hiçbir yöntem uygulanabilir bu aşamada bulunursa sonra işleme ikinci aşama devam ediyor. Bu herhangi bir Java programlama geçerliydi çağıran garanti Java SE 5.0 önce dil belirsiz olarak kabul edilmez giriş değişken parametre yöntemleri, örtülü Boks ve/veya kutulama. Ancak değişken parametre yöntemi (madde 8.4.1)ilanı bu yöntem, belirli bir yöntem için seçilen değiştirebilir yöntem çağırma ifade, değişken parametre bir yöntem, çünkü bir sabit olarak kabul edilir ilk aşamada parametre yöntemi. Örneğin, m(Nesne...)ilan zaten m(Nesne) beyan ettiği bir sınıfta neden m(Nesne) artık bazı çağırma ifadeleri (m(null) gibi) için seçilecek, (Object[]) m daha özel.

  2. İkinci aşama (§15.12.2.3) aşırı çözümleme ve kutulama boks verirken, ama yaparhala değişken parametre yöntem çağırma kullanılmaz. Eğer hiçbir yöntem uygulanabilir bu sırada bulunursa faz sonra işleme üçüncü aşama devam ediyor. Bu yöntem hiç değişken parametre ile seçilen sağlar yöntem ise sabit parametre yöntemi ile ilgili ise çağırma çağırma.

  3. Üçüncü aşama (§15.12.2.4)sağlar değişken parametre yöntemleri ile birlikte olmak aşırıBoks ve kutulama.

DÜZENLEME:

Bu derleyici TestOverload(char... c) kurucusunu çağırmak için zorlamak istiyorsanız, kurucu çağrısı char[]: a iletebilirsiniz

new TestOverload (new char[] {'a'});

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Martin

    Caroline Mar

    19 EYLÜL 2008
  • DJAndrewRyan

    DJAndrewRyan

    22 Ocak 2007
  • Metheud

    Metheud

    9 EYLÜL 2006