将Iterator传递给方法

时间:2013-02-24 23:05:36

标签: java spring spring-data

我正在尝试将迭代器作为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);”方法而不是“Iterable save(Iterable entities);”方法

另外,既然看起来接受迭代器的方法只是调用了entity.persist(),那么在foreach循环中调用save(U实体)是不是有任何缺点呢?

1 个答案:

答案 0 :(得分:7)

  

任何人都可以告诉我我做错了它试图称之为“U save(U entity);”方法而不是“Iterable save(Iterable entities);”方法

save(Iterable<U> entities)此处显然无效,因为您有Iterator<E>,而不是Iterable<E>。他们是不同的类型。给定两个方法重载,这些重载对于您尝试传递的参数都是无效的,编译器已经选择了一个抱怨...它不会真正重要,它说它无效, IMO。

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

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

毕竟,List<E>扩展了Iterable<E> - 所以此方法调用有效...