JAVA—存储实现接口的类,然后返回实例
我想知道如何将实现IModule的类存储到一个集合中,然后返回该类的实例,而不是IModule的实例。例如,我希望这样的工作:JAVA—存储实现接口的类,然后返回实例,java,generics,Java,Generics,我想知道如何将实现IModule的类存储到一个集合中,然后返回该类的实例,而不是IModule的实例。例如,我希望这样的工作: ModuleService m = new ModuleService(); m.register(new CoreModule(this)); m.getRegistration(CoreModule.class); ModuleService#getRegistration应返回CoreModule,而不是IModule。我尝试过使用Capture泛型和T,但不能
ModuleService m = new ModuleService();
m.register(new CoreModule(this));
m.getRegistration(CoreModule.class);
ModuleService#getRegistration应返回CoreModule,而不是IModule。我尝试过使用Capture泛型和T,但不能在字段上使用T,在类上使用它们也没有多大意义
使用?通用:
private Set<? extends IModule> modules = new HashSet<>();
public ModuleService(STBot bot) {
this.bot = bot;
}
public <T extends IModule> boolean register(T module) {
if (modules.stream().noneMatch(m -> m.getId().equalsIgnoreCase(module.getId()))) {
modules.add(module);
return true;
} else return false;
}
public Optional<? extends IModule> getRegistration(Class clazz) {
return modules.stream().filter(m -> m.getClass().equals(clazz)).findFirst();
}
public Set<? extends IModule> getModules() {
return Collections.unmodifiableSet(modules);
}
private Set这里有一个简单的实现方法
public class ModuleService {
private Map<Class<?>, IModule> modules = new HashMap<>();
public void register(IModule module) {
modules.put(module.getClass(), module);
}
public <T extends IModule> T getRegistration(Class<? extends T> clazz) {
return (T) modules.get(clazz);
}
}
公共类模块服务{
私有的Map@user编辑postJust useSet
通配符意味着该集合中的所有iModule都是您不知道的某种类型,这可能不是您在这里想要的。此外,您的getRegistration
方法可以设置为Optional getRegistration(Class clazz){…}
是的,但是我不能在片场上使用它,所以我不能像那样存储它。嗯?你不能在集上使用什么?使用集
没有一个有界通配符是完全正确的谢谢!这很有效,只是将它改为返回一个可选的。你能解释一下类是什么吗类吗