2017-05-16 17 views
-1

ジェネリックの専門家ではなく、コードの繰り返しを避けるためにいくつかのクラスのリエンジニアリングをしようとしているので、可能な限り最良の方法でジェネリックを使用するようにしています。メソッドはジェネリックの引数には適用されません

私はマークされた行の次のエラーが取得しています:、私はこれがあなたたちが必要とするすべての情報だと思う

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

} 

そうになるコメントやI:ここでは私のクラスを

The method delete(Long) in the type CrudRepository is not applicable for the arguments (capture#5-of ? extends KeyProfileEntity)

をもっと添付してください。

ありがとうございます!

+0

問題がCrudRepository –

+0

こんにちはモーリスに位置します。もっと情報をくれませんか?その宣言の意味ですか?私はちょうど を保護しました。CrudRepository myRepositoryを保護しました。ただし、別のメソッドから割り当て可能にするには、 "?extends"を指定する必要があります。ご協力いただきありがとうございます! – Carloshf

+0

これは問題ではありません:deleteメソッドがlongを期待しているという問題が発生しました –

答えて

2

あなたはmyRepositoryから<? extends ...>バウンドワイルドカードを除去することによって、それを修正することができます:

protected CrudRepository<KeyProfileEntity, Long> myRepository; 

を私の知る限り見ることができるように、あなたのクラスでもKeyProfileEntityのサブクラスで、まだ使用可能になります。

KeyProfileService service = new KeyProfileServiceImpl(); 
    service.update(new ChildKeyProfileEntity()); 

制限は1つだけです:getList()は、List<ChildKeyProfileEntity>ではなく、常にList<KeyProfileEntity>を返します。

また、あなたは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); 
    } 
... 
} 
関連する問題