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