2016-01-29 9 views
5
public interface Parent{ 
} 

public class Child implements Parent{ 
} 

public <T extends Parent> Class<T> getClass(){ 
    return Child.class; // compile error, add cast to Class<T> 
} 

Yukarıdaki kodla ilgili bir hata bulunmadığını umuyorum, ancak Child.class döndüğümde derleme hatası alıyorum.Java Döndüğünde hata Derleme Genel Sınıf türü

+1

public Class getClass() {return Child.class; } Eserleri. ama ilk versiyonun neden çalışmadığını anlamıyorum. – user2201253

+0

Eğer 'Child.class' için her zaman geri dönüyorsanız' Class 'kullanıyor olmanız gerekir ... Jenerikleri sadece anlamlı olduğu yerlerde kullanın ... – Codebender

cevap

5

Java'ya, T'dan bağımsız olarak her zaman Child.class'u döndürmesini söyleyemezsiniz. Ebeveynlerden Child olmayan başka sınıflar olabilir. Ayrıca, herhangi bir yerde T kullanmıyorsunuz, kodunuz çok anlamlı değil. İki olası çözümler:

public Class<? extends Parent> getAClass() { 
    return Child.class; 
} 

ya da belki

public <T extends Parent> Class<T> getAClass(Class<T> clazz){ 
    return clazz; 
} 

İkinci örnek derler ama T sınıf düzeyinde ilan edildi ise muhtemelen daha mantıklıdır.

Ayrıca, varolan getClass() yöntemiyle bir ad çakışmasını önlemek için yönteminizi yeniden adlandırdım. açıkça mevcut uygulama için çalışma zamanında başarısız kaldığı

Class<SomeOtherChildClass> clazz = instance.getAClass(); 

(SomeOtherChildClass varsayarak da Parent genişletir): Bu kod yasal olsaydı

1

, yazmak mümkün olacaktır.

"Düzeltilmiş" bir kod önermiyorum çünkü ne yapmaya çalıştığınızdan emin değilim.

2

İnceleme BadChild türüyle çağrılması

public class Main { 
    public interface Parent{} 
    public class Child implements Parent{}   
    public class BadChild implements Parent {} 

    public static <T extends Parent> Class<T> getClazz() { 
     return Child.class; // compile error, add cast to Class<T> 
    } 

    public static void main(String[] args) { 
     Class<BadChild> clazz = Main.<BadChild>getClazz(); 
    } 
} 

aşağıdaki yöntem getClazz() arayan tarafı için de geçerlidir. Çalışma zamanı hatalarına yol açacak yönteminizi derlerseniz. Bu yüzden bu yasak.