我需要初始化几个不同类型的对象,从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)”,我更喜欢“(植物)”,“(动物)”......视情况而定。怎么做?
答案 0 :(得分:1)
将对象强制转换为Dict。这是plolymorphism的好处 - 你不必引用特定的子类。您可以编写代码,只引用单个基类Dict。这给你:
是的,有很多方法可以实现你所要求的(想到一个重大的转换声明),但我不建议这样做。