繁体   English   中英

不同类型地图的地图

[英]Map of Maps of different types

我需要初始化几个对象,这些对象具有从XML定义到bean的不同类型。 我有目录结构:

data \
|_ plant \
|  |_ pine.xml
|  |_ cucumber.xml
|_ animal \
|  |_dog.xml
|  |_cat.xml
|_ fungus \
...

我想将其有序地存储在两级地图中:第一级地图包含第二级地图。 每个第二级贴图包含一种类型的对象(植物/动物/真菌...类)。 每个类都扩展了Dict类,该类具有一些公共字段和方法(名称/ getName()/ setName(),desc / getDesc()/ setDesc(),toString(),equals()等)。

现在,为了便于创建所有这些对象,我想使用工厂方法Dict.fabricateAll()。 这里的问题是:如何创建二级映射,使其具有精确的类型参数。 我不希望HashMap <String,Dict>但是HashMap <String,Plant>,HashMap <String,Animal>等

现在,我有以下代码:

public static Map<String, Map<String, ? extends Dict>> fabricateAll() {
    File topDir = new File(Dict.defDir);
    File[] subDirs = topDir.listFiles();
    Map<String, Map<String, ? extends Dict>> dicts = new HashMap<>(subDirs.length);

    String type;
    String handle;
    Map<String, ? extends Dict> dict;

    for (File subDir : subDirs) {
        type = subDir.getName(); 
        File[] xmlFiles = subDir.listFiles(new FilenameFilter() {public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".xml"); }} );
        dict = new HashMap<>(xmlFiles.length);

        for (File defFile : xmlFiles) {
            handle = defFile.getName();
            handle = handle.substring(0, handle.lastIndexOf('.')-1);

            try {
                Class c = Class.forName(type);
                Constructor bob = c.getConstructor(Class.forName("java.lang.String"));
                dict.put(handle, bob.newInstance(handle));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        dicts.put(type, dict);
    }
    return dicts;
}

但是一行存在问题:dict.put(handle,bob.newInstance(handle));

错误消息:“接口Map <K,V>中的方法不能应用于给定类型。必需:字符串,CAP#1找到:字符串,对象

是的,那newInstance()生成对象,可能应该进行一些强制转换,但是要做什么呢? 我不想只在这里使用“(Dict)”,而是更喜欢“(Plant)”,“(Animal)”...。 怎么做?

将对象投射到Dict。 这就是多态性的好处-您不必引用特定的子类。 您只能使用对单个基类Dict的引用来编写代码。 这给您:

  • a)松耦合-对特定子类没有编译时依赖性
  • b)可扩展性-您可以添加子类,而无需修改此代码。

是的,有多种方法可以实现您所要求的(想到一个大的转换语句),但是我不建议这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM