Усовершенствованный вопрос Java Generics: зачем нам указывать избыточную информацию - PullRequest
0 голосов
/ 31 октября 2008

У меня есть некоторый общий класс для моей модели 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.

Как я могу заставить эту работу работать без лишней информации?

Спасибо, Фред


Редактировать: Упрощенный пример

1 Ответ

2 голосов
/ 31 октября 2008

Вы пробовали:

public interface WatchableDao<T extends Watchable<?>>

(т.е. это Watchable<Something>, но мне все равно, что такое Something)

Я не пробовал, но оно того стоит.

РЕДАКТИРОВАТЬ: после редактирования вопроса, кажется, вам действительно нужен PK в качестве параметра типа для интерфейса. В этом случае я считаю, что вы должны эффективно повторить ограничение, как и вы. Да, это избыточно, но я думаю, что это проще, чем язык, указывающий, какие ограничения эффективные будут применяться к PK на основе его использования в качестве аргумента типа в другом месте. Если это утешит, то же самое верно и в C #.

Это также делает ограничения на PK понятными только из самого интерфейса, вместо того, чтобы смотреть на другой интерфейс, чтобы увидеть, что выполнимо.

...