2012-11-14 121 views
2

我升級了下面的代碼:無法從地圖<字符串,對象>投地圖<字符串,列表<地圖<String,字符串>>>

return this.getMethod().execute(mp); 

凡執行方法有簽名:

public Map<String,Object> execute(Object mp) 

我有代碼預計返回的方法是Map<String, List<Map<String, String>>>,但編譯器窒息的轉換。那麼我可以/我如何才能正確投射? Java 5和Java 6之間會有什麼變化,這會使編譯時間成爲問題嗎?

+4

你能澄清你的意思是「5至6之間」嗎? –

+2

我認爲他的意思是java版本 –

+3

你能保證地圖的值只會是'List >'嗎?爲什麼有人使用泛型,但是然後把'Object'作爲值類型? –

回答

5

只要你確保返回的地圖將只包含List<Map<String, String>>類型的值,那麼你需要使用雙投:

Map<String, Object> map = this.getMethod().execute(mp); 
@SuppressWarnings("unchecked") //thoroughly explain why it's okay here 
Map<String, List<Map<String, String>>> mapWithNarrowedTypes = 
     (Map<String, List<Map<String, String>>>)(Map<?, ?>)map; 
return mapWithNarrowedTypes; 
1

往往是這種類型的問題,我覺得有用下面的結構:

public final class Reinterpret { 

    @SuppressWarnings("unchecked") 
    public static <T> T cast(Object object) { 
     return (T)object; 
    } 

} 

,您可以使用,例如,像這樣:

... 
public void process(Map<String, Object> data) { 
    // method can properly handle any Object value, 
    // including String 
} 

... 
    Map<String, String> stringData = ... 
    process(Reinterpret.<Map<String, Object>>cast(stringData)); 
... 

正如你所猜測的那樣,Java泛型類型系統的非常精確的弱化受C++的reinterpret_cast操作符的啓發,並且適用於類似的上下文;然而,它也可以在其他幾個人使用,當你想降低您的鑄件,例如冗長,

Map<String, Object> objectMap = Reinterpret.cast(stringMap); 

的Java 6的類型推斷是足夠強大(或足夠弱,取決於你的觀點,如)把右邊的表達式轉換成左邊的要求;但是,請注意,這對分配工作正常,但不適用於函數調用,這就是爲什麼上述示例要求在調用本身中完全指定參數類型的原因。

相關問題