Java 存储对具有泛型类型参数的类的引用及其具有相同类型参数的实现

Java 存储对具有泛型类型参数的类的引用及其具有相同类型参数的实现,java,generics,Java,Generics,我使用Map存储对泛型类型参数类和具有相同泛型类型参数的实现对象的引用,更具体地说: public class SomeImpl<T extends BaseClass> { void execute(T instance); } 公共类SomeImpl{ 无效执行(T实例); } 现在,在另一个类中,我想根据泛型类型参数存储对实现的引用 private Map<Class<BaseClass>, SomeImpl<BaseClass>&g

我使用
Map
存储对泛型类型参数类和具有相同泛型类型参数的实现对象的引用,更具体地说:

public class SomeImpl<T extends BaseClass> {

    void execute(T instance);
}
公共类SomeImpl{
无效执行(T实例);
}
现在,在另一个类中,我想根据泛型类型参数存储对实现的引用

private Map<Class<BaseClass>, SomeImpl<BaseClass>> map;
私有地图;
然而,我发现在这里使用泛型有些混乱,特别是因为显示了许多不安全的强制转换警告

private <T extends BaseClass> void register(SomeImpl<T> impl, Class<T> aClass) {
    // unsafe
    Class<BaseClass> configClass = (Class<BaseClass>) aClass; 
    // unsafe
    map.put((SomeImpl<BaseClass>) impl, configClass);
}
私有无效寄存器(SomeImpl impl,类aClass){
//不安全
类configClass=(类)aClass;
//不安全
map.put((SomeImpl)impl,configClass);
}
稍后当我想要检索某个实例时

private SomeImpl<BaseClass> get(Class<? extends BaseClass> aClass) {
    // unsafe
    return (SomeImpl<BaseClass>) map.get(aClass); 
}

private SomeImpl get(Class最后,我采用了以下解决方案。非常感谢Radiodef,他向我指出了使用类型安全的异构容器

private Map<Class<?>, SomeImpl<?>> map = new HashMap<>();
这确实是一个真正的未保存强制转换,因为编译器无法确保传递正确类型的
BaseClass
。但是,我可以确保始终传递正确类型(或者使用
isAssignableFrom
强制传递)

这允许我从数据库加载一些
BaseClass
对象,例如:

List<BaseClass> list = getSomeBaseClasses();

Map<Class<? extends BaseClass>, List<BaseClass> map = list.stream()
    .collect(Collectors.groupingBy(BaseClass::getClass));

map.forEach((aClass, bases) -> {
    SomeImpl<BaseClass> impl = getBaseImpl(aClass);
    impls.forEach(impl::execute);
}
List List=getSomeBaseClasses();

map什么是
binder
?@Nikolas抱歉,将它更改为
impl
什么是
binders
?我建议它是
map
@Nikolas是的。谢谢你的提示!你试过
私有静态无效寄存器(SomeImpl impl,Class aClass){}
私有静态SomeImpl获取(Class aClass){}}了吗
?映射存储
BaseClass
无论如何。我会让您的
getBaseImpl
方法返回
SomeImpl@Radiodef问题是我必须使用
基类
(当我使用Hibernate获取多个子类时,我创建了一个最小的示例。目前它没有编译,因为
someimpl我想我也可以用它来打开一个新问题。因为
BaseLoader
基本上是一个消费者,您可以使用通配符捕获帮助器方法调用
load
,就像我的回答一样。(我刚才编辑了答案,所以如果你以前没有看到这个例子,现在有一些额外的东西。)下面是你的Ideone示例的一部分:非常感谢,我在这里也能找到类似的东西:
public SomeImpl<BaseClass> getBaseImpl(Class<? extends BaseClass> aClass) {
    return (BaseLoader<BaseClass>) map.get(type);
}
List<BaseClass> list = getSomeBaseClasses();

Map<Class<? extends BaseClass>, List<BaseClass> map = list.stream()
    .collect(Collectors.groupingBy(BaseClass::getClass));

map.forEach((aClass, bases) -> {
    SomeImpl<BaseClass> impl = getBaseImpl(aClass);
    impls.forEach(impl::execute);
}