具有多种类型的CrudRepository的不兼容类型

时间:2018-06-04 07:35:50

标签: java spring-boot ternary-operator

我正在开发可以管理学生和教师的网络应用程序。这两个都是类,并且有一个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创建一个通用变量?

1 个答案:

答案 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());
}