2012-06-01 7 views
15

:"yöntemi türü için belirsiz" ama tipleri belirsiz DEĞİLDİR (ve hata 4.2 gölgede Tutulma 3.7.2 yükseltme ile geliyor) Ben tanımladık

public static int[] getArray(final int... params) { 
    return params; 
} 
public static <T> T[] getArray(final T... params) { 
    return params; 
} 

Ve

bu kullanmak
getArray(1, 2) 

ve şimdi tutulma 4.2 derleme hatası alıyorum:

method is ambiguous for the type

Ama gördüğünüz gibi bu belirsiz değildir. Ne yapabilirim? java Autoboxing bir Integer ve tersi ile int bekliyoruz bir yöntemi çağırmak için izin verdiğinden

+0

Derleyici, otomatik kutulamayı uygulamaya çalışıyor olabilir; bu durumda, yöntemlerden hiçbirini seçemez. Emin değilim, ama açıkça argümanları döküm deneyebilirsiniz: 'GetArray ((int) 1, (int) 2)' –

+0

uygun bir dille etiketlemek Lütfen (Java C#??). JDK 1.7 ila yolu javactır By –

+1

4.2 –

cevap

9

Aslında bu belirsiz, yani getArray(1, 2) gerçekten yöntemlerden herhangi geçerli bir çağrı olabilir.

Ne yaptığınızı bildiğim kadarıyla, bir dizi bir Dizi oluşturmak için bir yardımcı yönteme sahip olmak istersiniz. Belki de yapabileceğiniz en basit şey, int ile getIntArray() arasında yapılan yöntemi yeniden adlandırmaktır. Ya da bir int dizisini istiyorsanız çok okunabilir olan new int[] {1, 2} kullanın.

Bu bilgileri, dilin belirtiminde http://docs.oracle.com/javase/specs/jls/se5.0/jls3.pdf adresinde bulabilirsiniz (Sizin durumunuzda, çağrılan yöntemin belirlenmesi, bölüm 15.12.2'de açıklanan işlemin 3. adımına gidecektir. Derleme Zamanı Adım 2: Yöntem İmzasını Belirleme, aritmetik değişkeni kullandığınız ve 3. adımda, yöntem çağrılarının her ikisi de geçerli olur)

+0

Bunun açık olduğunu sanmıyorum. Yükseltme 4.2 (eski tutulması 3.7.2) gölgede önce biz inşa etmek JDK6-Yasal Uyum düzey kullandıkları aynı proje ayarları vardı ve biz binaya üzerinde hiçbir hata vardı. Otomatik konfigürasyon eski konfigürasyonda zaten kullanıldı. Yükseltme neden bu sorunu getirir? – elb

+0

@ user1430985 Davranışı açıklayan belirtime bir başvuru ekledim.Şartnameye inanıyorsam, projeniz eclipse derleyicinin önceki sürümündeki bir hataya bağımlı hale gelmişti. –

23

Bu, eclipse bug 383780'da bir hata olarak bildirilmiştir.
İşte düzeltmenin belgelerdir: Temelde https://bugs.eclipse.org/bugs/attachment.cgi?id=218320

, derleyici hatayı düzeltmek için, son Tutulma salınımını (bugün itibariyle 4.2.1), eclipse.ini içinde -vmargs sonra aşağıdaki satırı ekleyin olsun: (o zaman gerekebilir söyleniyor)

-DtolerateIllegalAmbiguousVarargsInvocation=true 

tutulmayı yeniden başlatın ve size projeleri yeniden inşa etmek için, Samuel doğrudur: yöntem çağırma belirsiz. Yukarıdaki kod örneği daha önce çalıştı çünkü 1.6'dan önce JDK'da bug vardı; ve tutulmadaki özel derleyici bu hatayı başarıyla taklit etti. Juno geliştirirken (JDK hata 1.7 giderilmiştir çünkü), onlar, insanların sinir bozucu bir sürü (ben dahil) bir hata olarak belirsiz çağırmayı bildirerek this bug sabit. Yukarıdaki düzeltme, tutukluğun "Yasadışı muğlak Varargs Invocation'u tolere etmesini" açıkça istemenizi ister.