Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Java中的方法返回泛型映射_Java_Generics_Map - Fatal编程技术网

如何从Java中的方法返回泛型映射

如何从Java中的方法返回泛型映射,java,generics,map,Java,Generics,Map,我有一个解析器类,它解析文档并在映射中返回解析后的数据 这是我的课的样子 public interface DocumentParser { public Map<String, String> parse(Document document); } public class ExcelParser implements DocumentParser{ @Override public Map<String, String> par

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

这是我的课的样子

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

}
公共接口文档解析器{
公共地图解析(文档);
}
公共类ExcelParser实现DocumentParser{
@凌驾
公共地图解析(文档){
//TODO自动生成的方法存根
返回新的HashMap();
}
}
公共接口文件{
公共InputStream getInputStream();
}
公共类ExcelDocument实现文档{
@凌驾
公共输入流getInputStream(){
//TODO自动生成的方法存根
返回null;
}
}
公共接口文档验证程序{
公共无效验证(地图文档数据、地图参考数据、列表参考键列表);
}
公共类ExcelValidator实现DocumentValidator{
@凌驾
公共无效验证(地图文档数据、,
映射引用数据,列表引用键列表){
//TODO自动生成的方法存根
}
}
公共类TestMain{
/**
*@param args
*/
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
Document Document=新的ExcelDocument();
DocumentParser parser=新的ExcelParser();
Map parsedData=parser.parse(文档);
DocumentValidator DocumentValidator=新的ExcelValidator();
validate(parsedData,newhashmap(),newarraylist());
}
}
现在可能有不同类型的解析器,如CSVParser或PDFParser等

但我不确定地图将包含什么类型的对象。我不想限制类的用户只返回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>();
    }
}
您可以对
DocumentValidator
界面执行相同的操作:

public interface DocumentValidator<K,V> {

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

}

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

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>();
    }
}
您可以对
DocumentValidator
界面执行相同的操作:

public interface DocumentValidator<K,V> {

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

}

那为什么不直接使用地图呢?或
地图
?我不确定您在映射中存储了什么。@ElliottFrisch此映射是否接受字符串作为键,接受Person作为值?它将接受字符串和任何对象。@ElliottFrisch如果我执行公共映射解析(文档文档){//TODO自动生成的方法存根返回新的HashMap();}它会给我一个编译时错误“类型不匹配:无法从HashMap转换为Map”。好。
公共映射解析(文档)
。那么为什么不直接使用
Map
?或
Map
?我不确定您在地图中存储的是什么。@ElliottFrisch此地图是否接受字符串作为键和Person作为值?它将接受字符串和任何对象。@ElliottFrisch如果我执行公共地图分析(文档文档){//TODO自动生成的方法存根返回新的HashMap();}它给了我一个编译时错误“类型不匹配:无法从HashMap转换为Map”。好的。
publicmap解析(文档)
。我尝试过这样做,但我无法相应地修改类。你能帮我用Map制作它吗。我的意思是,我有点困惑将用什么替换?这是否意味着如果我有一个ExcelParser,这意味着我必须在类声明中声明ExcelParser?这将实现什么目的?@Sam编辑为使用
Brian谢谢你的回答。我的另一个疑问是,如果我有另一个方法,比如DocumentParser类中的validate,那么它是否也应该返回像Prase方法返回这样的泛型。我该怎么做呢?因为为DocumentParser类指定的任何类型都被分配给了T,对吗?@Sam你只需要对你的Other做同样的事情r接口。再次编辑。Brian我明白你想说的。但是如果documentData是map If而referenceData是map of呢?这真的有可能实现吗?我的意思是我们可以适应不同的整数类型?我已经尝试过这样做,但我无法相应地修改类。你能帮我用map制作它吗。我的意思是,我有点困惑将用什么替换?这是否意味着如果我有一个ExcelParser,这意味着我必须在类声明中声明ExcelParser?这将实现什么?Sam编辑使用
Brian感谢你的回答。我还有一个疑问是,我是否有另一个方法,比如DocumentParser类中的validate,如果有也应该返回一些泛型的东西,比如Prase方法返回。我怎么做?因为为DocumentParser类指定的任何类型都已分配给T right?@Sam您只需对其他接口执行相同的操作。再次编辑。Brian我明白您的意思。但是如果documentData是map If和referenceData呢地图是吗?这真的有可能实现吗?我的意思是我们在哪里可以容纳不同的整数类型?