Java 基于某个对象的运行时泛型类型获取CDIBean
我有时会遇到这样一种情况:我希望根据某个对象的运行时类型选择某个通用接口的合适实现。我想用CDI来做这件事。我想做的示例:Java 基于某个对象的运行时泛型类型获取CDIBean,java,generics,cdi,Java,Generics,Cdi,我有时会遇到这样一种情况:我希望根据某个对象的运行时类型选择某个通用接口的合适实现。我想用CDI来做这件事。我想做的示例: public interface Id {} public interface AId extends Id { String getAValue(); } public interface BId extends Id { Integer getBValue(); } public interface Loader<I extends Id&g
public interface Id {}
public interface AId extends Id {
String getAValue();
}
public interface BId extends Id {
Integer getBValue();
}
public interface Loader<I extends Id> {
Object load(I id);
}
public class ALoader implements Loader<AId> {
public Object load(AId id) {
return id.getAValue();
}
}
public class BLoader implements Loader<BId> {
public Object load(BId id) {
return id.getBValue();
}
}
public class MyCdiBean {
@Inject
private Instance<Loader> loaders;
public <I extends Id> Object loadSomething(I id) {
return loaders.select(new TypeLiteral<Loader<I>>() {}).get().load(id);
}
}
但我希望避免检查的实例(基本上,我希望它在不知道AId
和BId
的情况下工作)
我也知道它可以使用限定符注释,尽管不是以完全类型安全的方式
还有其他干净的方法吗?您认为什么是解决这个问题的好方法?泛型是编译时的错觉。在运行时,它们被表示为对象
(使用字节码查看器确认这一点),这可能是出现问题的原因。至于避免instanceof
,我实际上可以使用限定符,但无论如何,您需要了解AId
。如何向Loader
界面添加其他方法?可能类似于:布尔canLoad(对象o)
?然后,您将在指定的加载程序实现中隐藏instanceof
。
public class MyCdiBean {
@Inject
private Loader<AId> aLoader;
@Inject
private Loader<BId> bLoader;
public Object loadSomething(Id id) {
if (id instanceof AId) {
return aLoader.load((AId)id);
}
return bLoader.load((BId) id);
}
}