Усовершенствованный вопрос Java Generics: зачем нам указывать избыточную информацию

StackOverflow https://stackoverflow.com/questions/252775

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть некоторый универсальный класс для моей модели 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 понятными только из самого интерфейса, вместо того, чтобы смотреть на другой интерфейс, чтобы увидеть, что выполнимо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top