2014-04-29 20 views
5

içinde aşırı var args yöntemi ve sarıcı yöntemleri aşağıdaki kodu derlemeye çalıştım ama hataBelirsizlik hata java

Ben belirsiz neden biliyor bağışta bulunan kimse
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 ' 
} 

alırken. int değerini geçtiğimde otomatik kutu ve test(Integer..x) aramalı mı demek istediğimi ifade eder. Benzer satır test(long..x) aranmalıdır… bu benim anlayışımdır .. birisi bunun neden açık olduğunu açıklayabilir mi?

+0

Kullanmakta olduğunuz JDK sürümü nedir? Ve komut satırından derlerseniz ne olur? Lütfen bunun tarafından ısırılmadığınızı kontrol edin: http://stackoverflow.com/a/7689819/2231632 – prabugp

cevap

2

Değişken Arity en özel bir yöntem belirlenmesinde son olan için boks gibi aynı ölçüde geçerlidir.

Bir değişken Arity üyesi yöntemi adlandırılmış m aynı adı eğer başka değişken Arity üyesi yöntemine göre daha özeldir: bir özdür burada - kurallar hangi JLS 15.12.2.4 tanımlanan birçok varken vararg yöntemi uygular belirlemek için ya:

  • [...]
  • Bir üye yöntemi k parametresi vardır ve diğer n parametrelerini n ≥ k ve vardır:

İlk yöntemin parametrelerinin türleri U1, ..., Uk-1, Uk []. Diğer yöntemin parametrelerinin türleri T1, ..., Tn-1, Tn []. 1'den n'ye kadar olan tüm j için <: Tj Sizin durumunuzda, k = n ve U1 [] = int [] ve T1 [] = uzun []; bu nedenle, eğer int <: long veya tam tersi. Diğer bir deyişle, hesaba alınan tür int [] vs long [] değil, uzun ve uzun değildir. Ve bu int <: olur, yani int ... metodu seçilmeli ve derlenmelidir.


Sonuç:

kod gerektiği (ve etmez) Java 7 ile ince derlemek ancak baskılar altında kod Java 7 ile int Java 5 veya 6 ile derlemek olmaz:

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

OP'nin sorusu olan m (Tamsayı ... i) 'hakkında ne dersiniz? [DAHİL OLMAYACAK ...] (http://ideone.com/JTrTYq) ve [İşte nedeni.] (Http://stackoverflow.com/a/23364636/1686291) –