【发布时间】:2015-01-12 00:55:56
【问题描述】:
我正在尝试根据 ParameterizedType 选择一个 bean。与 Google Guice 相关的解决方案似乎有大量的答案,但 Java EE 7 是否有可能?
public interface Handler<T> { ... }
@ApplicationScoped StringHandler implements Handler<String> { ... }
@ApplicationScoped IntegerHandler implements Handler<Integer> { ... }
然后在其他一些托管 bean 中:
@Inject private Instance<Handler<?>> handlers;
public <T> Handler<T> handlerFor( Class<T> handledClass )
{
// ???
}
下面是 Instance 中与类型相关的 select 方法:
<U extends T> Instance<U> select(TypeLiteral<U> subtype, Annotation... qualifiers);
TypeLiteral 的 javadoc 只是说你可以做类似的事情
TypeLiteral<List<String>> stringListType = new TypeLiteral<List<String>>() {};
这非常无用,因为我不知道编译时的类型。但是,我确实将 Class 对象作为类型参数参数。
Guice 似乎可以通过为您构造 TypeLiteral 对象来处理这个问题。 Java EE 7 中没有类似的工具吗?
【问题讨论】:
-
有什么理由不能做
@Inject Handler<T> handler? -
@John 由于类型擦除,如果我使用类型参数,容器在运行时将不知道类型并且不知道要注入哪一个。我很想在运行时将 Class 传递给它,但是没有 select(...) 。
-
您尝试注入的类是什么样的?
标签: java jakarta-ee generics cdi java-ee-7