У меня есть базовый универсальный класс, представляющий все объекты моей модели, которые имеют идентификатор любого типа:Java общий класс другого обобщенного класса
public abstract class IdObject<T> {
private T id;
public T getId() { return this.id; }
public void setId(T id) { this.id = id; }
}
Тогда у меня есть супер-интерфейс, представляющий DAO для тех, IdObject объекты:
public interface IdObjectDAO<T extends IdObject<U>> {
public T getObjectById(U id);
}
но я получаю ошибку компиляции из «U не может быть разрешен к типу». Если изменить определение интерфейса с помощью:
public interface IdObjectDAO<T extends IdObject<U extends Object>> {...}
Я получаю ошибку компиляции из «ошибок синтаксиса на знак„продолжается“,, как ожидается». Единственный способ определить интерфейс без ошибок компилятора:
public interface IdObjectDAO<T extends IdObject<? extends Object>> {...}
, но тогда у меня нет типа псевдонима (U) для метода public T getObjectId(U id)
. Единственное решение, которое я нашел, чтобы решить это с помощью 2 параметров типа:
public interface IdObjectDAO<T extends IdObject<U>, U> {...}
, но я хочу, чтобы избежать использования этих 2 параметров типа, чтобы не указывать тип идентификатора в модели и DAO классов:
public class Person extends IdObject<Integer> {...}
public interface PersonDAO extends IdObjectDAO<Person, Integer> {...}
^^^^^^^^^ <== avoid this
Может ли кто-нибудь думать по-другому реализовать этот общий родовой или определить интерфейс IdObjectDAO
?
Заранее благодарен!
Я думаю, что версия два параметра является правильным и единственным способом сделать это , Вы ожидаете, что компилятор сможет «заглянуть внутрь» вашего IdObject для типа id, и это просто невозможно. – Chris
Попробуйте это общественный интерфейс IdObjectDAO { public T getObjectById (U id); } –
Это также должно ответить на ваш вопрос: http://stackoverflow.com/questions/14953029/generic-generics-syntax-error-on-token-extends-expected –