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>  {  
}

谁能告诉我我做错了什么,它试图调用“U save(U entity);” 方法而不是“可迭代保存(可迭代实体);” 方法?

另外,因为它看起来像接受迭代器的方法只是调用 entity.persist() 反正我只是在 foreach 循环中调用 save(U entity) 有什么缺点吗?

4

1 回答 1

7

谁能告诉我我做错了什么,它试图调用“U save(U entity);” 方法而不是“可迭代保存(可迭代实体);” 方法?

那么save(Iterable<U> entities)显然在这里是无效的,因为你有一个Iterator<E>,而不是一个Iterable<E>。他们是不同的类型。鉴于两个方法重载对于您尝试传递的参数都无效,编译器选择了一个来抱怨......它说的无效并不重要,IMO

目前尚不清楚您为什么要打电话iterator(),但您应该尝试将代码更改为:

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

毕竟,List<E>扩展Iterable<E>- 所以这个方法调用将是有效的......

于 2013-02-24T23:08:57.717 回答