gpt4 book ai didi

generics - Guice SPI : find bindings by wildcard types

转载 作者:行者123 更新时间:2023-12-02 00:44:55 24 4
gpt4 key购买 nike

Guice 提供了一种查找给定类型 (Injector#findBindingsByType) 的所有绑定(bind)的方法,它还提供了 TypeLiteral class似乎可以从中构造通配符类型。我想做的是找到某种类型的所有绑定(bind),这些类型由通配符类型参数化,但我不知道该怎么做。看一下 guice src 表明我可能会叫错树,但我想我还是会四处打听......所以例如给定一个类型

Foo<E extends Bar>
BarImplOne implements Bar
BarImplTwo implements Bar

和一些绑定(bind),比如
bind(new TypeLiteral<Foo<BarImplOne>>() {}).to(MyFooOne.class);
bind(new TypeLiteral<Foo<BarImplTwo>>() {}).to(MyFooTwo.class);

然后我希望能够发现两个绑定(bind),例如
Injector.findBindingsByType(TypeLiteral.get(Types.newParameterizedType(Foo.class, Types.subtypeOf(Bar.class))));

有任何想法吗?

干杯
马特

最佳答案

不幸的是,没有开箱即用的 API 可以告诉您一个 TypeLiteral 是否可以从另一个分配。你需要用一堆可怕的 instanceof 检查来做一个老式的循环。像这样恶心的东西:

for (Map.Entry<Key<?>, Binding<?>> entry 
: injector.getBindings().entrySet()) {
Type type = entry.getKey().getTypeLiteral().getType();
if (!(type instanceof ParameterizedType)) continue;

ParameterizedType parameterized = (ParameterizedType) type;
if (parameterizedType.getRawType() != Foo.class) continue;

Type parameter = .getActualTypeArguments()[0]
if (!(parameter instanceof Class)) continue;

Class<?> parameterClass = (Class<?>) parameter;
if (!Bar.class.isAssignableFrom(parameterClass)) continue;

results.add(entry);
}

当然,使用现成的 API 做一些事情会更好。我欢迎对实现和测试 TypeLiteral.isAssignableFrom(TypeLiteral) 的 Guice 做出贡献。联系我们的用户列表来做志愿者!

关于generics - Guice SPI : find bindings by wildcard types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1100784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com