2016-01-29 11 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> 
} 

Oczekuję, że nie wystąpi żaden błąd związany z powyższym kodem, jednak wystąpi błąd kompilacji po zwróceniu klasy Child.class.Błąd kompilacji Java po powrocie Rodzaj klasy ogólnej

+1

klasa publiczna getClass() {return Child.class; } Prace. ale nie rozumiem, dlaczego pierwsza wersja nie działa. – user2201253

+0

Powinieneś używać 'Class ' jeśli zawsze będziesz zwracać 'Child.class' ... Używaj generycznych tylko tam, gdzie ma to sens ... – Codebender

Odpowiedz

5

Nie można powiedzieć, aby Java zawsze zwracała Child.class niezależnie od numeru T. Mogą istnieć inne klasy od rodzica, które nie są Child. Poza tym, ponieważ nie używasz T w dowolnym miejscu, Twój kod nie ma większego sensu. Dwa możliwe rozwiązania:

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

czy może

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

Drugi przykład kompiluje, ale prawdopodobnie więcej sensu, jeśli T został uznany na poziomie klasy.

Zmieniono także nazwę metody, aby uniknąć konfliktu nazwy z istniejącą metodą getClass().

1

Jeśli ten kod były legalne, możliwe byłoby napisać:

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

(zakładając SomeOtherChildClass również rozciąga Parent), które wyraźnie nie w czasie wykonywania dla istniejących implementacji.

Nie oferuję "poprawionego" kodu, ponieważ nie jestem pewien, co próbujesz zrobić.

2

przejrzeć następujące

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(); 
    } 
} 

Wywołanie metody getClazz() z BadChild typu jest ważna na stronie rozmówcy. Gdybyś mógł skompilować swoją metodę, która prowadziłaby do błędów w czasie wykonywania. Dlatego jest to zabronione.

Powiązane problemy