我正在开发可以管理学生和教师的网络应用程序。这两个都是类,并且有一个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
。找到`java。
这是如何实现的,如何制作它以便我可以为我想要使用的特定CrudRepository
创建一个通用变量?
答案 0 :(得分:0)
问题是仿制药不匹配。如果您只想允许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());
}