Усовершенствованный вопрос Java Generics: зачем нам указывать избыточную информацию
Вопрос
У меня есть некоторый универсальный класс для моей модели POJO JPA, который выглядит следующим образом:
public interface Identifiable<PK extends Serializable> {
PK getUniqueId();
}
public interface GenericDao<T extends Identifiable<PK>> {
public T findById(PK id);
}
Этот код не скомпилируется. Чтобы это работало, мне нужно указать
public interface GenericDao<T extends Identifiable<PK>, PK extends Serializable>
Но это избыточная информация !! Тот факт, что T расширяет Identifiable, подразумевает, что тип PK будет указан для экземпляра Identifiable и что этот тип будет использоваться для PK DAO. Р>
Как я могу заставить эту работу работать без лишней информации?
Спасибо, Фред
<Ч>Изменить. Упрощенный пример.
Решение
Вы пробовали:
public interface WatchableDao<T extends Watchable<?>>
(т. е. это Watchable<Something>
, но мне все равно, что такое Something
)
Я не пробовал, но стоит попробовать.
РЕДАКТИРОВАТЬ: после редактирования вопроса кажется, что вам действительно нужен PK в качестве параметра типа для интерфейса. В этом случае я считаю, что вы должны эффективно повторить ограничение, как и вы. Да, это избыточно, но я думаю, что это проще, чем язык, указывающий, какие ограничения ффективные будут применяться к PK на основе его использования в качестве аргумента типа в другом месте. Если это утешит, то же самое верно и в C #.
Это также делает ограничения на PK понятными только из самого интерфейса, вместо того, чтобы смотреть на другой интерфейс, чтобы увидеть, что выполнимо.