gpt4 book ai didi

java - 不同类型 map 的 map

转载 作者:太空宇宙 更新时间:2023-11-04 07:47:29 27 4
gpt4 key购买 nike

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

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

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

现在,为了方便创建所有这些对象,我想要有工厂方法 Dict.fabricateAll()。问题是:如何创建二级映射,以便它们具有精确的类型参数。我不需要 HashMap 而是 HashMap 、HashMap

现在我有以下代码:

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

错误消息:“接口(interface) Map 中的方法无法应用于给定类型。必需:字符串,CAP#1 发现:字符串,对象

是的,newInstance() 生成对象,并且可能应该进行一些强制转换,但是强制转换是什么?我不想在这里只使用“(字典)”,我更喜欢“(植物)”,“(动物)”......酌情使用。如何做到这一点?

最佳答案

将对象转换为字典。这就是多态性的好处 - 您不必引用特定的子类。您可以仅引用单个基类 Dict 来编写代码。这给你:

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

是的,有很多方法可以实现您所要求的(想到一个大的 switch 语句),但我不会推荐任何方法。

关于java - 不同类型 map 的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054346/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com