Generics 如何使用Xtend简洁地定义参数化类的Guice绑定?
下面的Java代码设置Guice绑定。它使用Generics 如何使用Xtend简洁地定义参数化类的Guice绑定?,generics,syntax,guice,anonymous-class,xtend,Generics,Syntax,Guice,Anonymous Class,Xtend,下面的Java代码设置Guice绑定。它使用AbstractModule的匿名子类提供了configure的实现来设置绑定,并使用TypeLiteral的匿名子类为特定类型参数()创建Map到HashMap的绑定 injector=Guice.createInjector(新抽象模块(){ @覆盖受保护的void configure(){ 绑定(新的TypeLiteral(){}) .to(新的TypeLiteral(){}); } }); 我怎么能用Xtend写这个呢? 就我所见,Xtend
AbstractModule
的匿名子类提供了configure
的实现来设置绑定,并使用TypeLiteral
的匿名子类为特定类型参数()创建Map
到HashMap
的绑定
injector=Guice.createInjector(新抽象模块(){
@覆盖受保护的void configure(){
绑定(新的TypeLiteral(){})
.to(新的TypeLiteral(){});
}
});
我怎么能用Xtend写这个呢?
就我所见,Xtend不支持实现匿名类或嵌套类(文档中没有提到它们,我也猜不出有效语法)。因此,我必须在单独的Xtend文件中定义我的
AbstractModule
和我的TypeLiteral
实现。。。不太简洁。我是否错过了一个Xtend或Guice技巧来让它正常工作?引入一个真正的类而不是匿名的内部类怎么样?您可以使用闭包来实现模块接口:
injector=Guice.createInjector[
绑定(typeof(SomeType))到(typeof(AnImplementation))
]
但是,这并不能解决类型文本的问题。您必须使用Java来实现这一点,但我认为这不会有什么坏处。在相关说明中,您可以使用Xtend闭包来实现Guice的提供程序接口 例如,在Java中调用IResourceScopeCache.get:
@Inject
private IResourceScopeCache cache;
public EvaluatedResource getEvaluatedResource(EObject object) {
final Resource resource = object.eResource();
return cache.get("key", resource, new Provider<Object>() {
public Object get() {
return evaluate(resource);
}
});
}
public EvaluatedResource evaluate(Resource resource) {
...; // create EvaluatedResource evaluatedResource
return evaluatedResource; // return it
}
诀窍在于
[|…]
是一个零参数函数,在本例中是Provider.get()
Hi Christian-这是一个好主意,也是我目前的方法。然而,真正的类必须留在Java中,否则我还必须为所有TypeLiteral实现声明真正的类(实际上,我的代码比上面示例中显示的2个多)。我感兴趣的是是否有一个Xtend解决方案,或者一个不同的GUI API可以解决这个问题。让我引用一下Xtend主页:*Xtend并不是要一起取代Java,而是要在Java不发光的情况下成为一个方便的替代品。*我想guice模块是一件不应该在xtend中完成的事情
@Inject
IResourceScopeCache cache
def getEvaluatedResource(EObject object) {
val resource = object.eResource
cache.get("key", resource, [|evaluate(resource)])
}
def evaluate(Resource resource) {
... // create EvaluatedResource evaluatedResource
evaluatedResource // return it
}