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
Antwort
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.
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.
Ü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.
- 1. Generischer Objekt-/Klassentyp, der an httppost zurückgegeben wird?
- 2. Inkompatibler Rückgabetyp beim Überschreiben von Methoden generischer Klassen in Java
- 3. Unterschiedliches Verhalten zwischen Java 5 & 6 beim Überladen generischer Methoden
- 4. Fehler beim Klassentyp als Ausnahme in C++
- 5. Java-Proxy-Instanz für einen Klassentyp erstellen?
- 6. Java generischer Typ mit Wildcard
- 7. Kompilierfehler beim Aufruf eines Funktionszeigers in C
- 8. Java - Verhalten der Klassenmitglieder von generischer Klasse
- 9. Java-Programm benutzerdefinierte Ausnahme erzeugt einen Kompilierfehler
- 10. Warum bekomme ich diesen Kompilierfehler in Java?
- 11. Warum bekomme ich diesen Kompilierfehler in Java?
- 12. Geben Sie einen verschachtelten Klassentyp in Java zurück
- 13. Expliziter Konvertierungsoperatorfehler beim Konvertieren generischer Listen
- 14. IntelliJ: Lambda-Ausdruck auswerten löst einen Kompilierfehler beim Debugging aus
- 15. Java-Methode Signatur mit generischer Rückkehr Klasse
- 16. Erzwingen mehrerer generischer Bounds in Java Rückgabetyp
- 17. Verwenden generischer Java-Klassen in Matlab
- 18. passieren generischer Typ Enum als Parameter (Java)
- 19. toString() ein generischer Typ in Java
- 20. Generischer Parametertyp und Rückgabetyp in Java
- 21. ANDROID-Kompilierfehler (keine JVM initialisiert)
- 22. Reflections konnte nicht Klassentyp erhalten
- 23. Best Practice beim Zurückgeben einer Platzhalterliste in Java
- 24. Fehler beim Zurückgeben eines Java-Objekts an Javascript
- 25. Xcode Kompilierfehler
- 26. Java: Zurückgeben einer Sammlung
- 27. Java-Funktionsproblem - Array zurückgeben
- 28. Instantiate-Klasse vom Klassentyp
- 29. C++ Unvollständige Klassentyp Zeiger
- 30. OpenCV SurfDescriptorExtractor Kompilierfehler
öffentliche Klasse erweitert Parent> getClass() {return Child.class; } funktioniert. aber nicht verstehen, warum die erste Version nicht funktioniert. – user2201253
Sie sollten 'Class' verwenden, wenn Sie 'Child.class' immer zurückgeben ... Generics nur dort verwenden, wo es Sinn macht ... –
Codebender