gpt4 book ai didi

java - 如何从 Java 中的方法返回通用 Map

转载 作者:行者123 更新时间:2023-11-29 07:51:04 25 4
gpt4 key购买 nike

我有一个解析器类,它解析文档并在 Map 中返回解析后的数据。

这是我的类(class)的样子。

public interface DocumentParser {

public Map<String, String> parse(Document document);
}


public class ExcelParser implements DocumentParser{

@Override
public Map<String, String> parse(Document document) {
// TODO Auto-generated method stub
return new HashMap<String, String>();
}

}

public interface Document {
public InputStream getInputStream();
}

public class ExcelDocument implements Document{

@Override
public InputStream getInputStream() {
// TODO Auto-generated method stub
return null;
}

}


public interface DocumentValidator {

public void validate(Map<String, String> documentData, Map<String, String> referenceData, List<String> referenceKeyList);

}

public class ExcelValidator implements DocumentValidator{

@Override
public void validate(Map<String, String> documentData,
Map<String, String> referenceData, List<String> referenceKeyList) {
// TODO Auto-generated method stub

}

}


public class TestMain {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Document document = new ExcelDocument();
DocumentParser parser = new ExcelParser();
Map<String, String> parsedData = parser.parse(document);
DocumentValidator documentValidator = new ExcelValidator();
documentValidator.validate(parsedData, new HashMap()<String, String>, new ArrayList()<String>);
}

}

现在可能有不同类型的解析器,如 CSVParser 或 PDFParser 等。

但我不确定 map 将包含什么类型的对象。我不想限制类的用户只返回 map 。

用户甚至可以返回一些自定义对象。我想给予用户返回任何类型对象的自由。

如果我执行 Map,则必须在捕获 parse 方法的返回值时进行显式转换。

有人可以建议可以做些什么来实现更好的设计吗?

最佳答案

如果我明白你在问什么,为什么不简单地让你的界面通用?

public interface DocumentParser<K,V> { 

Map<K,V> parse(Document document);
}


public class ExcelParser implements DocumentParser<String, String> {

@Override
public Map<String, String> parse(Document document) {
// TODO Auto-generated method stub
return new HashMap<String, String>();
}

}

public SomeOtherParser implements DocumentParser<String, Integer> {

@Override
public Map<String, Integer> parse(Document document) {
// TODO Auto-generated method stub
return new HashMap<String, Integer>();
}
}

编辑从评论中添加:你的类(class)已经说过KV通过声明它实现接口(interface)并填充类型来明确。所以实例化你的类只是:

ExcelParser ep = new ExcelParser(); 
Map<String, String> map = ep.parse(someDocument);

SomeOtherParser sop = new SomeOtherParser();
Map<String, Integer> otherMap = sop.parse(someOtherDoc);

你会对你的 DocumentValidator 做同样的事情界面:

public interface DocumentValidator<K,V> {

void validate(Map<K, V> documentData, Map<K, V> referenceData,
List<K> referenceKeyList);

}

(我猜最后一个 List 参数包含与映射键相同的类型)

来自评论的最后一个编辑:您可以在接口(interface)声明中拥有任意数量的类型; <K, V, K2, V2>如果你真的需要它是完全合法的:

public interface DocumentValidator<K, V, K2, V2> {

void validate(Map<K, V> documentData, Map<K2, V2> referenceData,
List<K2> referenceKeyList);

}

public class ExcelValidator implements DocumentValidator<String,String,String,Integer>{

@Override
public void validate(Map<String, String> documentData,
Map<String, Integer> referenceData,
List<String> referenceKeyList) {
// TODO Auto-generated method stub

}
}

关于java - 如何从 Java 中的方法返回通用 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21177722/

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