方法不适用于泛型的参数

时间:2017-05-16 12:53:41

标签: java generics

我不是泛型的专家,因为我正在尝试对某些类进行重新设计以避免代码重复,所以我强迫自己使用泛型来尽可能地做到这一点。

我在标记的行中收到下一个错误:

  

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

}

我认为这是你们需要的所有信息,否则请评论,我会附上更多信息。

提前致谢!

1 个答案:

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