我正在尝试将迭代器作为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实体)是不是有任何缺点呢?
答案 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>
- 所以此方法调用有效...