Учитывая общий интерфейс, например
interface DomainObjectDAO<T>
{
T newInstance();
add(T t);
remove(T t);
T findById(int id);
// etc...
}
Я хотел бы создать субинтерфейс, который задает параметр типа:
interface CustomerDAO extends DomainObjectDAO<Customer>
{
// customer-specific queries - incidental.
}
Реализация должна знать фактический тип параметра шаблона, но, конечно, средства стирания стилей недоступны во время выполнения. Есть ли какая-то аннотация, которую я мог бы включить, чтобы объявить тип интерфейса? Что-то вроде
@GenericParameter(Customer.class)
interface CustomerDAO extends DomainObjectDAO<Customer>
{
}
Затем реализация может извлечь эту аннотацию из интерфейса и использовать ее в качестве замены для доступа к родовому типу среды выполнения.
Некоторая предыстория:
Этот интерфейс реализован с использованием динамических прокси JDK, как описано здесь. Неоригинальная версия этого интерфейса работает хорошо, но было бы лучше использовать generics и не создавать методы в подинтерфейсе, чтобы указать тип объекта домена. Общие и прокси-серверы заботятся о большинстве вещей, но фактический тип необходим во время выполнения для реализации метода newInstance
, среди прочих.