Gegeben wieAnnotation zur Verfügung generischer Typ
eine generische Schnittstelle macheninterface DomainObjectDAO<T>
{
T newInstance();
add(T t);
remove(T t);
T findById(int id);
// etc...
}
Ich möchte eine Subschnittstelle erstellen, die den Typ-Parameter gibt:
interface CustomerDAO extends DomainObjectDAO<Customer>
{
// customer-specific queries - incidental.
}
Die Umsetzung muss die aktuelle Vorlage wissen Parametertyp, aber natürlich ist Typ Löschmittel zur Laufzeit nicht verfügbar. Gibt es eine Anmerkung, die ich zum Deklarieren des Schnittstellentyps hinzufügen könnte? So etwas wie
@GenericParameter(Customer.class)
interface CustomerDAO extends DomainObjectDAO<Customer>
{
}
Die Umsetzung könnte dann diese Anmerkung von der Schnittstelle holen und verwenden Sie es als Ersatz für die Laufzeit generischen Typen Zugriff.
Einige Hintergrundinformationen:
Diese Schnittstelle implementiert wird JDK dynamische Proxies als here skizziert. Die nicht-generische Version dieser Schnittstelle hat gut funktioniert, aber es wäre schöner, Generics zu verwenden und die Methoden nicht in einer Subschnittstelle zu erstellen, nur um den Domänenobjekttyp anzugeben. Generics und Proxies kümmern sich um die meisten Dinge, aber der tatsächliche Typ wird zur Laufzeit benötigt, um unter anderem die Methode newInstance
zu implementieren.
Haben Sie versucht, Ihre eigene Anmerkung zu schreiben? –
@Lauri - Ich habe nicht mein eigenes gemacht, aber ich könnte das tun, ich sehe eine Menge Fragen über Generika und Frustrationen über die Typ-Löschung, also hoffe ich, dass dies bereits geschehen ist. – mdma