2015-01-04 15 views
8

Son zamanlarda yansıma ile çok şey yapıyorum ve bu küçük yardımcı programı uyguladı. İlk versiyonun derlenmediğini, ancak ikincisinin bunu bulduğuna şaşırdım.Şaşırtıcı derleme hatası Bir sınıfın sınıfını almak

derlemek yok:

public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) { 
    return Array.newInstance(componentType, 0).getClass(); 
} 

derler ve gayet güzel çalışıyor:

public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) { 
    Class c = Array.newInstance(componentType, 0).getClass(); 
    return c; 
} 

İki soru: yanlış olan ne? Bunu yapmanın daha iyi bir yolu var mı?

TypeUtils.java:[12,60] incompatible types: java.lang.Class<capture#1 of ? extends java.lang.Object> cannot be converted to java.lang.Class<T[]> 

cevap

4

getClass() dönüş tipi Class<?> geçerli:

İşte ilk gelen derleme hatası var.

Örneğinizde, Class<?> öğesini Class<T[]> (return ifadesinde) olarak atandınız, yanlış bir dosyaya ihtiyacınız var.

Bu ince derlenir: - Ham tip döküm örtük olarak görünüyor

@SuppressWarnings("unchecked") // added to suppress compiler warning 
public static <T> Class<T[]> getArrayClassOfType(Class<T> componentType) 
{ 
    return (Class<T[]>) Array.newInstance(componentType, 0).getClass(); 
} 

ikinci örnekte ile, Tamam çalışır ham tip Class kullanın. Ancak, bir derleyici uyarısı alacaksınız, çünkü bu cesur bir tekniktir.

Class<?> olarak doğru bir şekilde parametreleştirirseniz, yayınlamaya da ihtiyacınız olacak.

+0

Ah. Bunu denedim, ama intellij bastırma uyarılarıyla bile hala üzgündü (reddedilemez türler hakkında kırmızı çizili). Bir hata buldum gibi görünüyor. – RutledgePaulV

+0

Oyuncunuz varsa, Tamam. Belki de bu tür uyarıları hata olarak ele alacak şekilde yapılandırılmış IDE'niz var mı? Bunu Eclipse'de yapabileceğinizi biliyorum. – MightyPork

+0

Hm, bu tür bir hata seviyesini ayarlamanın yollarını aradım ama bulamadım. Ayrıca, jetbeyinlerin daha önce bir hata olarak bunun gibi bir durumu (burada http://youtrack.jetbrains.com/issue/IDEA-105846) düzeltdiğini görüyorum, bu yüzden sunacağım. – RutledgePaulV