我正在玩Xtend,并遇到了障碍。
我的类使用Spring Data存储库。这是界面:
public interface UserRepository extends GraphRepository<UserNode>, RelationshipOperationsRepository<UserNode> {
public UserNode findByEntityId(Long entityId);
}
GraphRepository<T>
的超级界面(part of Spring Data,而不是我的项目)声明如下:
@Transactional
<U extends T> U save(U entity);
@Transactional
<U extends T> Iterable<U> save(Iterable<U> entities);
但是,以下代码对我失败:
// UpdateUserProcessorExample.xtend
class UpdateUserProcessorExample {
@Autowired
UserRepository repository
def updateUser()
{
var user = repository.findByEntityId(1L)
// The following line generates an error:
repository.save(user)
}
}
这会产生:
Bounds mismatch:type参数不是有效替代 方法的有界类型参数 保存(可迭代)
看起来好像Xtend正在选择错误的重载方法。
我尝试过添加类型提示,ala:
var UserNode user = repository.findByEntityId(1L)
但是这仍然会产生相同的错误。 我在这里做错了什么?
答案 0 :(得分:2)
在Xtend邮件列表中,Sven建议他针对此问题提出错误:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=413138
他还提供了以下解决方法:
一个不太好的解决方案是覆盖相应的方法 UserRepository并用UserNode替换T,如下所示:
public interface UserRepo extends GraphRepository<UserNode> {
UserNode findByEntityId(Long entityId);
@Override UserNode save(UserNode entity);
@Override <U extends UserNode> Iterable<? extends U> save(Iterable<? extends U> entities);
答案 1 :(得分:1)
我不明白为什么你在方法上引入了额外的类型参数,你不能只使用类级别的那个吗?
@Transactional
T save(T entity);
@Transactional
Iterable<? extends T> save(Iterable<? extends T> entities);
这应该有效。