2016-01-29 13 views
5

Ich erwarte, dass es keinen Fehler über den obigen Code gibt, jedoch bekomme ich Kompilierfehler, wenn ich Child.class zurückgebe.Java Kompilierfehler beim Zurückgeben generischer Klassentyp

+1

öffentliche Klasse getClass() {return Child.class; } funktioniert. aber nicht verstehen, warum die erste Version nicht funktioniert. – user2201253

+0

Sie sollten 'Class ' verwenden, wenn Sie 'Child.class' immer zurückgeben ... Generics nur dort verwenden, wo es Sinn macht ... – Codebender

Antwort

5

Sie können Java nicht anweisen, immer Child.class unabhängig von T zurückzugeben. Möglicherweise gibt es andere Klassen, die sich von übergeordneten Elementen erstrecken, die keine Child sind. Da Sie T nirgendwo verwenden, macht Ihr Code auch keinen Sinn. Zwei mögliche Lösungen:

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

oder vielleicht

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

Das zweite Beispiel kompiliert, würde aber wahrscheinlich mehr Sinn machen, wenn T auf Klassenebene deklariert wurde.

Außerdem habe ich Ihre Methode umbenannt, um einen Namenskonflikt mit der vorhandenen Methode getClass() zu vermeiden.

1

Wenn dieser Code legal waren, wäre es möglich, schreiben:

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

(unter der Annahme, SomeOtherChildClass erstreckt sich auch Parent), die eindeutig zur Laufzeit für die bestehende Implementierung scheitern würde.

Ich biete keinen "korrigierten" Code an, da ich nicht sicher bin, was Sie zu tun versuchen.

2

Überprüfen Sie die folgenden

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

Aufruf der Methode getClazz() mit BadChild Typ ist für den Anrufer Seite gültig. Wenn Sie Ihre Methode kompilieren könnten, die zu Laufzeitfehlern führen würde. Deshalb ist das verboten.

Verwandte Themen