我正在开发一个具有多个系统的应用程序(在我的情况下,系统是我的应用程序中处理特定任务的可加载组件,例如:翻译、配置处理、音频等)。这些系统共享一些常用方法,因此我创建了一个接口:
public interface System {
    public void initialize();
    public void uninitialize();
}
但是每个系统都有自己的方法,对应于系统执行的任务。这是我的系统的两个示例
第一个存储设置:
public class SettingsSystem implements System {
    @Override
    public void initialize() {
        // few lines of code here
    }
    @Override
    public void uninitialize() {
        // few lines of code here
    }
    public Object getSetting(String key) {
        // returns a setting
    }
}
以及进行翻译的语言系统。
public class LanguageSystem implements System {
    @Override
    public void initialize() {
        // few lines of code here
    }
    @Override
    public void uninitialize() {
        // few lines of code here
    }
    public void setLanguage(String language) {
        // sets language
    }
    public boolean load( String name) {
        // loads a file
    }
    public String translate(String key) {
        // returns translation of a key
    }
}
我将 System 实例存储在静态 HashMap 中,因为我想在我的应用程序的任何地方访问它们。我创建了一个静态方法来通过键返回任何系统。
public class App {
    // note: System is the System interface I created
    private static Map<String, System> systems = new HashMap<String, System>();
    public static Object getSystem(String key) {
        return systems.get(key);
    }
}
如果我调用 App.getSystem() 方法,它会返回一个对象。所以如果我打电话...
App.getSystem("settings");
...它将作为对象返回正确的项目。但问题是,我不能调用 SettingsSystem 的 getSetting() 方法,因为它告诉我没有这样的方法。
如果我以这种方式实现它:
public static System getSystem(String key) {
    return systems.get(key);
}
我可以调用 initialize() 或 uninitialize() 方法,但仍然没有可用的 getSettings() 方法。
我想要的是当我调用 App.getSystem() 方法时,我希望它返回其中包含的正确类型的对象。例子:
App.getSystem("settings"); // I want it to return a SettingsSystem object
// So I can do:
String width = App.getSystem("settings").getSetting("width");
App.getSystem("language"); // I want it to return a LanguageSystem object
// So I can do:
String welcome = App.getSystem("language").translate("hello_world");
这怎么可能?提前致谢。
更新
根据您的帮助,我决定为每个系统声明 getter 方法:
public SettingsSystem getSettingsSystem() {
    return (SettingsSystem) system.get("settings");
}
感谢您的建议!