1

我正在玩 Xtend,但遇到了障碍。

我的班级使用 Spring Data 存储库。这是界面:

public interface UserRepository extends GraphRepository<UserNode>, RelationshipOperationsRepository<UserNode> {
        public UserNode findByEntityId(Long entityId);
}

的超级接口GraphRepository<T>(它是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)
    }
}

这会产生:

边界不匹配:类型参数不是方法 save(Iterable) 的有界类型参数的有效替代品

Xtend 似乎选择了错误的重载方法。

我试过添加类型提示,阿拉:

var UserNode user = repository.findByEntityId(1L)

但这仍然会产生相同的错误。我在这里做错了什么?

4

2 回答 2

2

在 Xtend 邮件列表中,Sven 建议他针对这个问题提出了一个错误:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=413138

他还提供了以下解决方法:

一个不太好的解决方案是覆盖 UserRepository 中的相应方法并将 T 替换为 UserNode,如下所示:

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);
于 2013-07-17T22:31:16.380 回答
1

我不明白你为什么在方法上引入了额外的类型参数,你不能只使用类级别的参数吗?

@Transactional
T save(T entity);

@Transactional
Iterable<? extends T> save(Iterable<? extends T> entities);

那应该行得通。

于 2013-07-17T06:50:51.167 回答