参数化接口
问题描述:
鉴于类型的所有豆类的纲领性查找:参数化接口
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
{
}
有什么办法来解决这个问题?
感谢
答
我想你可以做的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
答
看一看它是由容器提供,这样做的Instance
豆:
@Any
@Inject
private Instance<MyInterface<?>> myParametrizedInterfaces;
的Instance
bean是一个Iterable
,这意味着你可以遍历所有的bean实现上述接口
通知的?
泛型参数。在这种情况下,所有通用参数都会匹配(java泛型)
+0
实例正常工作,但在我的用例中,我需要静态查找bean。我基本上包装deltaspikes DependentProvider(或获得依赖bean的类似方法),以便它在使用后自动处置依赖的作用域bean,以防止调用应用程序范围的bean时发生内存泄漏。谢谢你的回答对一些人有用 – Gee2113
我把你的想法应用到了我的用例中 - 尽管它有点难看,但它的工作方式与预期的一样。谢谢 – Gee2113
不客气。顺便说一句,它不是很难看 - 我的意思是没有其他方式比拥有类型参数的额外类。这不是真正的CDI限制,而是Java的限制。由于类型擦除,你会失去这些信息,因此你需要在其他地方弥补它。 – Siliarus