Java 基于某个对象的运行时泛型类型获取CDIBean

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

我有时会遇到这样一种情况:我希望根据某个对象的运行时类型选择某个通用接口的合适实现。我想用CDI来做这件事。我想做的示例:

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);
    }
}