参数化接口

问题描述:

鉴于类型的所有豆类的纲领性查找:参数化接口

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
+0

我把你的想法应用到了我的用例中 - 尽管它有点难看,但它的工作方式与预期的一样。谢谢 – Gee2113

+0

不客气。顺便说一句,它不是很难看 - 我的意思是没有其他方式比拥有类型参数的额外类。这不是真正的CDI限制,而是Java的限制。由于类型擦除,你会失去这些信息,因此你需要在其他地方弥补它。 – Siliarus

看一看它是由容器提供,这样做的Instance豆:

@Any 
@Inject 
private Instance<MyInterface<?>> myParametrizedInterfaces; 

Instance bean是一个Iterable,这意味着你可以遍历所有的bean实现上述接口

通知的?泛型参数。在这种情况下,所有通用参数都会匹配(java泛型)

+0

实例正常工作,但在我的用例中,我需要静态查找bean。我基本上包装deltaspikes DependentProvider(或获得依赖bean的类似方法),以便它在使用后自动处置依赖的作用域bean,以防止调用应用程序范围的bean时发生内存泄漏。谢谢你的回答对一些人有用 – Gee2113