Generics 如何使用Xtend简洁地定义参数化类的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

下面的Java代码设置Guice绑定。它使用
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
}