2015-10-04 89 views
3

我剛學習如何使用通配符和有界類型參數。我想在傳遞HashMap的方法中使用(我認爲)有界的通配符。我見過有界的類型參數和有界通配符的例子,但是我沒有找到任何能夠告訴我如何將HashMap傳遞給HashMap可以包含不同值對象的方法。HashMap中的Java有界類型參數

Map<Integer, Company> 
Map<Integer, Employee> 
Map<Integer, Location> 

這是我上面列出的第一個地圖的例子:

public Map<Integer, Company> readXML(Map<Integer, Company> companies) { 

我想使用類似以下,以使這種方法來對付列出我在Google地圖中的任何一個以上。

public Map<Integer, ?> readXML(Map<Integer, ?> values) { 

有人可以告訴我一個關於如何在此方法中使用通配符作爲Map值的例子嗎?

1)我是否需要創建一個擴展值對象(公司,員工,位置)的Map類?

2)或者是否有更好的方法來實現這個目標?換句話說,我做錯了嗎?

謝謝您的建議。

+0

'Company','Employee'和'Location'之間的關係是什麼?他們有一個共同的超類型而不是「Object」嗎? –

+0

要限制參數類型之間或參數與返回類型之間的關係(表示關係),必須使用類型變量。通配符不允許你創建這樣的關係,它們只是約束特定的參數或返回類型。 – RealSkeptic

+0

@AndyTurner - 唯一常見的超類型是Object。我只是試圖想出一個巧妙的(非新手)方法來使用相同的XML解析器方法來解析我的任何Map對象的值。 – Patricia

回答

2

由於您的方法readXML(Map<Integer, ?(V)> companies)可以接受類型爲Company,Employee和Location的V。你可以用下面提到的方法解決這個問題。

  1. 可以使所有提到的類來擴展新的類或可爲落實我們的自定義類型的接口,並使用該類型V

  2. 附加參數添加到您的方法它發送給它的類信息,同時調用api。

    public <V> Map<Integer, V> readXML(Map<Integer, V> values, Class<V> clazz) { 
        if(clazz == Integer.class) { 
         ... 
        } else if// or if all the class type has same implementation use the 
          // || operator in the above if condition only. 
          ... 
        //and finally 
        else { 
         // either throw **IllegalArgument/Unsupported operation** exception 
         // for the type 'V' Or handle in any other way you like to implement 
        } 
    } 
    

    最後,IllegalArgument/UnsupportedOperation exception是未經檢查的例外。如果您決定拋出異常,請確保正確記錄您的方法。

+1

'class clazz'將在編譯時生成一個原始類型警告。正確的簽名應該是公共地圖 readXML(地圖值,類別 clazz)''。 – VGR