Я работаю над веб-приложением, где вы можете управлять учениками и учителями.Оба они являются классами и имеют Person
в качестве суперкласса.
Я использую Spring Boot, и для обоих классов я использую CrudRepository
для получения данных.Оба используют тип Long
для своего первичного ключа.
public interface StudentRepository extends CrudRepository<Student, Long> {
}
public interface TeacherRepository extends CrudRepository<Teacher, Long> {
}
Я работаю над поиском текущего зарегистрированного пользователя, где я хочу сделать что-то подобное, поэтому мне нужно только вызватьfindOne
метод один раз.
//Person
Person activePerson = activeUser.getPerson();
// Find the id from the active user
long activePersonId = activePerson.getId();
//Find the corresponding crudrepository
CrudRepository<Person, Long> repository = activePerson instanceof Student ? studentRepository : teacherRepository;
return repository.findOne(activePersonId);
При использовании этого я получаю сообщение об ошибке:
Несовместимые типы.Обязательно CrudRepository <Person, java.lang.Long>
.Найдено StudentRepository
Несовместимые типы.Требуется CrudRepository <Person, java.lang.Long>
.Найдено TeacherRepository
Как это получается, поскольку они оба имеют один и тот же суперкласс?
Для своей собственной попытки я попытался удалить общие теги из переменной repisitory
например:
CrudRepository repository = activePerson instanceof Student ? studentRepository : teacherRepository;
return repository.findOne(activePersonId);
Это также привело к ошибке несовместимых типов.
Несовместимые типы.Требуется Person
.Нашел `ява.
Как это происходит и как я могу сделать так, чтобы я мог сделать универсальную переменную для конкретного CrudRepository
, который я хочу использовать?