Ich habe eine Java-Schnittstelle definiert, die die Fähigkeit eines Objekts darstellt, sich selbst zu kopieren (nein, ich möchte nicht Cloneable
verwenden, aber danke für den Vorschlag ;-). Es ist generic:Casting auf einen rekursiv begrenzten Typ
public interface Copiable<T> {
T copy();
}
Ein Objekt nur Kopien seiner eigenen Art machen:
public class Foo implements Copiable<Foo> {
Foo copy() { return new Foo(); }
}
Nun, ich Class<?>
Objekte aus einer nicht-generischen API bin Lesen (Hibernate-Metadaten, wenn das von Interesse für jedermann), und wenn sie Copiable
sind, möchte ich sie mit einer meiner Komponenten registrieren. Die register
Methode hat die folgende Signatur:
<T extends Copiable<T>> register(Class<T> clazz);
Mein Problem ist, wie ich die Klasse geworfen haben, bevor es an die Methode übergeben? Was ich gerade mache ist:
Class<?> candidateClass = ...
if (Copiable.class.isAssignableFrom(candidateClass)) {
register(candidateClass.asSubclass(Copiable.class));
}
Das macht was ich will, aber mit einer Compiler-Warnung. Und ich glaube nicht, dass ich in der Lage sein werde, die rekursive Grenze in einem Laufzeit-Cast auszudrücken.
Gibt es eine Möglichkeit, meinen Code zu überarbeiten, um es typsicher zu machen?
Dank
Ja, das bestätigt, was ich erahnt habe. Dann nehme ich an, dass, wenn eine Klasse Copiable implementiert, implementiert Copiable, und ich kann die Warnung ignorieren. Dies ist akzeptabel, da alle Klassen unter meiner Kontrolle stehen. Ich akzeptiere diese Antwort, danke! –
Olivier
Und ja, das funktioniert zur Laufzeit. Die Klassen, die ich von Hibernate bekomme, sind die Klassen meiner Entitäten, in denen ich die Schnittstelle deklariere. – Olivier