0

以下 Java 代码设置 Guice 绑定。它使用一个匿名子类AbstractModule来提供一个实现configure来设置绑定,并使用匿名子类来为特定类型参数TypeLiteral创建一个绑定(如此处所述)。MapHashMap

injector = Guice.createInjector(new AbstractModule() {
    @Override protected void configure() {
        bind(new TypeLiteral<Map<String, Event>>() {})
            .to(new TypeLiteral<HashMap<String, Event>>() {});
    }
});

我怎么能在 Xtend 中写这个?

据我所知,Xtend 不支持实现匿名类或嵌套类(文档中没有提到它们,我也无法猜测出有效的语法)。所以我必须在单独的 Xtend 文件中定义我的AbstractModule和我的每个实现......不是很简洁。TypeLiteral我是否错过了 Xtend 或 Guice 技巧以使其正常工作?

4

3 回答 3

1

引入一个真正的类而不是一个匿名的内部类怎么样?

于 2011-11-20T11:05:50.590 回答
1

您可以使用闭包来实现模块接口:

注射器 = Guice.createInjector [绑定(typeof(SomeType)).to(typeof(AnImplementation))]

但是,这不会解决类型文字的问题。您必须为此使用Java,但我认为它不会受到伤害。

于 2011-11-21T20:09:28.080 回答
0

在相关说明中,您可以使用 Xtend 闭包来实现 Guice 的 Provider 接口。

例如,在 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
}

在 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
}

诀窍是这[|...]是一个零参数的函数,在这种情况下是Provider.get().

于 2012-05-04T13:07:07.723 回答