2

Spring Dataのメソッドの引数としてイテレーターを渡そうとしていますが、Eclipseは、Javaが同じメソッドのプレーンエンティティオーバーロードを呼び出そうとしていることを示しています。

public void persistLandTiles(List<LandTile> tilesToPersist) {
    landTileRepo.save(tilesToPersist.iterator());

}

エラー:

Bound mismatch: The generic method save(U) of type CRUDRepository<T> is not applicable
 for the arguments (Iterator<LandTile>). The inferred type Iterator<LandTile> is not a
 valid substitute for the bounded parameter <U extends LandTile>

呼び出されるインターフェイスメソッド:

@NoRepositoryBean
public interface CRUDRepository<T> extends PagingAndSortingRepository<T, Long> {

    /**
     * persists an entity by forwarding to entity.persist()
     * @param entity to be persisted
     * @return the saved entity (being the same reference as the parameter)
     */
    @Transactional
    <U extends T> U save(U entity);


    /**
     * persists the provided entities by forwarding to their entity.persist() methods
     * @param entities to be persisted
     * @return the input iterable
     */
    @Transactional
    <U extends T> Iterable<U> save(Iterable<U> entities);

自動配線されている私のインターフェース:

public interface LandTileRepo extends CRUDRepository<LandTile>, SpatialRepository<LandTile>  {  
}

「Usave(Uentity)」と呼ぼうとしている私が間違っていることを誰かに教えてもらえますか?「Iterablesave(Iterableentities);」の代わりにメソッド 方法?

また、イテレータを受け入れるメソッドはとにかくentity.persist()を呼び出すだけのように見えるので、とにかくforeachループでsave(U entity)を呼び出すだけの欠点はありますか?

4

1 に答える 1

7

「Usave(Uentity)」と呼ぼうとしている私が間違っていることを誰かに教えてもらえますか?「Iterablesave(Iterableentities);」の代わりにメソッド 方法?

は、ではなく、save(Iterable<U> entities)を持っているため、ここでは明らかに無効です。それらは異なるタイプです。渡そうとしている引数に対して両方とも無効な2つのメソッドのオーバーロードを考えると、コンパイラーは文句を言うために1つを選択しました...それが無効であると言っていることはそれほど重要ではありませ、IMO。Iterator<E>Iterable<E>

なぜ呼び出しているのかは明確ではありませんがiterator()、コードを次のように変更してみてください。

public void persistLandTiles(List<LandTile> tilesToPersist) {
    landTileRepo.save(tilesToPersist);    
}

結局のところ、List<E>extends-Iterable<E>したがって、このメソッド呼び出しは有効になります...

于 2013-02-24T23:08:57.717 に答える