2013-02-24 66 views
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> { 
} 

谁能告诉我是什么做错了,它是在尝试g来调用“U保存(U实体)”;“方法而不是“Iterable save(Iterable entities)”;“方法?

另外,因为它看起来像接受迭代器的方法只是调用entity.persist()无论如何,是否有任何缺点,我只是在foreach循环调用保存(U实体)呢?

回答

7

Can anyone tell me what I'm doing wrong that it's trying to call the " U save(U entity);" method instead of the " Iterable save(Iterable entities);" method?

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

目前尚不清楚为什么你打电话iterator()可言,但你应该尝试只是改变你的代码:

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

毕竟,List<E>延伸Iterable<E> - 所以这种方法的调用将是有效的?

+0

啊,是的,这是一个“不”的问题!我一定很累,谢谢! – CorayThan 2013-02-24 23:12:04

+0

当我查询的东西,我继续处理类“EndResult ”,它只返回一个迭代器,所以我一直不得不将迭代器转换为列表,我认为他们也只接受迭代器。 – CorayThan 2013-02-24 23:17:58