簡體   English   中英

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

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

編輯以添加注釋:您的班級已經通過聲明實現了接口並填充了類型來明確說明了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參數包含與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM