Несовместимые типы для CrudRepository с несколькими типами - PullRequest
0 голосов
/ 04 июня 2018

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

1 Ответ

0 голосов
/ 04 июня 2018

Проблема в том, что генерики не совпадают.Если вы хотите разрешить только реализации Person, вы должны правильно написать свой универсальный как ? extends Person:

CrudRepository<? extends Person, Long> repository = activePerson instanceof Student ? studentRepository : teacherRepository;

Хотя лично я, вероятно, написал бы:

if (activePerson instanceof Student) {
    return studentRepository.findOne(activePerson.getId());
} else {
    return teacherRepository.findOne(activePerson.getId());
}
...