[英]How to return a generic Map from a method in Java
我有一個解析器類,用於解析文檔並在Map中返回解析的數據。
這是我的班級樣子。
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。
用戶甚至可以返回一些自定義對象。 我想給予用戶返回任何對象的自由。
如果我這樣做,則必須在捕獲解析方法的返回值時進行顯式強制轉換。
有人可以建議在這里做什么以達到更好的設計效果嗎?
如果我理解您的要求,為什么不簡單地使您的界面通用?
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>();
}
}
編輯以添加注釋:您的班級已經通過聲明實現了接口並填充了類型來明確說明了K
和V
因此,要實例化您的課程只是:
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
參數包含與map鍵相同的類型)
注釋的最后一個編輯:接口聲明中可以有任意多個類型; 如果您確實需要<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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.