不同类型的地图的地图

时间:2013-02-24 17:22:26

标签: java factory

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

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

我想将它有序地存储在两级地图中:第一级地图包含二级地图。每个二级地图都包含一种类型的对象(类植物/动物/真菌......)。每个类都扩展了Dict类,它有一些常见的字段和方法(name / 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&lt; K,V&gt;中放入的方法无法应用于给定类型。必需:String,CAP#1 Found:String,Object

是的,newInstance()生成了对象,可能应该有一些演员而不是什么?我不想在这里“(Dict)”,我更喜欢“(植物)”,“(动物)”......视情况而定。怎么做?

1 个答案:

答案 0 :(得分:1)

将对象强制转换为Dict。这是plolymorphism的好处 - 你不必引用特定的子类。您可以编写代码,只引用单个基类Dict。这给你:

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

是的,有很多方法可以实现你所要求的(想到一个重大的转换声明),但我不建议这样做。