2013-02-24 94 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