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

时间:2014-01-17 04:11:34

标签: java generics map

我有一个解析器类,它解析文档并在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将包含哪种类型的对象。我不想限制类的用户只返回Map。

用户也可以返回一些自定义对象。我想让用户自由地返回任何类型的对象。

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

有人可以建议可以采取哪些措施来实现更好的设计吗?

1 个答案:

答案 0 :(得分:5)

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

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

编辑以添加评论:您的类已经通过声明它实现接口并填写类型来明确说明KV是什么。因此,实例化您的类只是:

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参数包含与地图键相同的类型)

评论的最后一次编辑:您可以在界面声明中拥有任意数量的类型;如果您真的需要它,<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

    }
}