我不是泛型的专家,因为我正在尝试对某些类进行重新设计以避免代码重复,所以我强迫自己使用泛型来尽可能地做到这一点。
我在标记的行中收到下一个错误:
CrudRepository类型中的delete(Long)方法不适用于参数(捕获#5-of?extends KeyProfileEntity)
我的班级:
public abstract class KeyProfileService {
protected CrudRepository<? extends KeyProfileEntity, Long> myRepository;
public List<KeyProfileEntity> getList() {
List<KeyProfileEntity> result = new ArrayList<>();
this.myRepository.findAll().forEach(result::add);
return result;
}
public KeyProfileEntity create(KeyProfileEntity entity) {
return this.myRepository.save(entity); //error
}
public boolean delete(long id) {
if (this.myRepository.exists(id)) {
this.myRepository.delete(this.myRepository.findOne(id));//error
return true;
}
return false;
}
public void update(KeyProfileEntity entity) {
this.myRepository.save(entity); //error
}
public KeyProfileEntity getEmployee(long id) throws NotFoundEntryException {
if (this.myRepository.exists(id))
return this.myRepository.findOne(id);
throw new NotFoundEntryException();
}
}
我认为这是你们需要的所有信息,否则请评论,我会附上更多信息。
提前致谢!
答案 0 :(得分:2)
您可以通过从<? extends ...>
myRepository
绑定通配符来解决此问题
protected CrudRepository<KeyProfileEntity, Long> myRepository;
据我所知,即使是KeyProfileEntity
的子类,您的课程仍然可用:
KeyProfileService service = new KeyProfileServiceImpl();
service.update(new ChildKeyProfileEntity());
只有一个限制:getList()
将始终返回List<KeyProfileEntity>
,而不是List<ChildKeyProfileEntity>
。
或者,您可以将KeyProfileService
设为通用,并确保使用绑定的已知子类型:
public abstract class KeyProfileService<K extends KeyProfileEntity> {
protected CrudRepository<K, Long> myRepository;
public List<K> getList() { // using K
List<K> result = new ArrayList<>(); // here too
this.myRepository.findAll().forEach(result::add);
return result;
}
public K create(K entity) { // using K
return this.myRepository.save(entity);
}
...
}