将东西放入Map <! - ?,? - >或将Map <string,string>转换为Map <! - ?,? - > </string,string>

时间:2013-02-24 10:08:42

标签: java generics easymock type-erasure

我不愉快地处理某人使用以下

定义的界面
public Map<?, ?> getMap(String key);

我正在尝试编写使用此接口的单元测试。

Map<String,String> pageMaps = new HashMap<String,String();
pageMaps.put(EmptyResultsHandler.PAGEIDENT,"boogie");
pageMaps.put(EmptyResultsHandler.BROWSEPARENTNODEID, "Chompie");
Map<?,?> stupid = (Map<?, ?>)pageMaps;
EasyMock.expect(config.getMap("sillyMap")).andReturn(stupid);

并且编译器正在进行中。

The method andReturn(Map<capture#5-of ?,capture#6-of ?>) in the type IExpectationSetters<Map<capture#5-of ?,capture#6-of ?>> is not applicable for the arguments (Map<capture#7-of ?,capture#8-of ?>)

如果我尝试直接使用pageMaps,它会告诉我:

The method andReturn(Map<capture#5-of ?,capture#6-of ?>) in the type IExpectationSetters<Map<capture#5-of ?,capture#6-of ?>> is not applicable for the arguments (Map<String,String>)

如果我pageMaps Map<?,?>,我就不能将字符串放在其中。

The method put(capture#3-of ?, capture#4-of ?) in the type Map<capture#3-of ?,capture#4-of ?> is not applicable for the arguments (String, String)

我已经看到一些客户端代码执行丑陋的未经检查的转换,例如

@SuppressWarnings("unchecked")
        final Map<String, String> emptySearchResultsPageMaps = (Map<String, String>) conf.getMap("emptySearchResultsPage");

如何将数据导入Map<?,?>,或将Map<String,String>转换为Map<?,?>

1 个答案:

答案 0 :(得分:5)

  1. 如果没有演员
  2. ,你无法写Map<String, String> map = getMap("abc");
  3. 问题更多地与easymock以及expectandReturn方法返回/预期的类型有关,我不熟悉这些方法。你可以写

    Map<String, String> expected = new HashMap<String, String> ();
    Map<?, ?> actual = getMap("someKey");
    boolean ok = actual.equals(pageMaps);
    //or in a junit like syntax
    assertEquals(expected, actual);
    
  4. 不确定这是否可以与你的嘲弄混合。这可能会奏效:

    EasyMock.expect((Map<String, String>) config.getMap("sillyMap")).andReturn(pageMaps);
    

    另请注意,您无法使用通配符向通用集合添加任何内容。所以这个:

    Map<?, ?> map = ...
    map.put(a, b);
    

    将无法编译,除非ab为空。