鉴于类型:
public interface Foo<T, X extends A>{...}
我需要使用编程查找来查找实现给定接口的bean,而不管参数类型如何。由于类型安全分辨率,这将返回一个空集:
final Set<Bean<?>> foos= BeanManagerProvider.getInstance().getBeanManager().getBeans(Foo.class, new AnyLit());
或通过Deltaspike:
org.apache.deltaspike.core.api.provider.BeanProvider.getDependent(Foo.class, new AnyLit())
其中AnyLit是:
private static class AnyLit extends AnnotationLiteral<Any> implements Any
{
}
有没有办法解决这个问题?
由于
答案 0 :(得分:1)
我认为你可以使用TypeLiteral
- 一个特殊的CDI类,它可以保存类型及其参数。通过这种方式,您可以大致以这种方式指定您想要的内容:
TypeLiteral<Foo<Object, Object>> typeLiteral = new TypeLiteral<Foo<Object, Object>>() {};
BeanManager bm; //assuming you can retrieve BM somehow
bm.getBeans(typeLiteral.getType(), new AnyLit());
现在,这是(我希望)符合CDI assignability rules(警告:未来的仿制药,在阅读之前先喝咖啡)。简而言之,您希望将Object
用作类型,以便:
<Bar>
(均可分配给Object
)FooImpl<T> implements Foo<T>
等参数也可以分配给Object
MyFoo implements Foo
答案 1 :(得分:0)
查看容器提供的Instance
bean,并执行以下操作:
@Any
@Inject
private Instance<MyInterface<?>> myParametrizedInterfaces;
Instance
bean是Iterable
,这意味着您可以迭代实现所述接口的所有bean
注意?
泛型参数。在这种情况下,所有通用参数都匹配(java generics)