У вас есть эта проблема, потому что ваш метод явно возвращает AbstractHistory
, а не подтип.
- Вам нужно будет привести ...
- ... если только вашРеализация репозитория понимала, что с каждым T вы получаете определенную историю.
Вы можете попробовать добавить другой тип, но я боюсь, что он потерпит неудачу:
public interface IHistoryRepository<
T,
H extends AbstractHistory<T>
> extends CrudRepository<H, Long> {
public H findFirst();
}
public interface StudentHistoryRepository extends IHistoryRepository<Student, StudentHistory> {}
public interface TeacherHistoryRepository extends IHistoryRepository<Teacher, TeacherHistory> {}
Я не знаюкакой фреймворк вы используете, вероятно Spring Data из имен;Хотя я использовал это в прошлом, я не знаю, сможет ли он это сделать.
В конце концов, ему нужно получить конкретный класс, и поскольку он является универсальным, стирание типов может помешать (если информация о конкретном типе, представляющем H, потеряна в отражении, то Spring Data, вероятно, не сможетделайте здесь много, если только вы не поможете с аннотацией или чем-то еще).
Другое решение, которое должно работать, - это сделать это для каждого дочернего интерфейса:
public interface StudentHistoryRepository extends CrudRepository<StudentHistory, Long> {
StudentHistory findFirst();
}
Или с другим интерфейсом:
public interface FindFirst<T> {
T findFirst();
}
public interface StudentHistoryRepository extends CrudRepository<StudentHistory, Long>, FindFirst<StudentHistory> {}