【发布时间】:2013-02-24 10:08:42
【问题描述】:
我不满意使用以下定义的接口
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<?,?>?
【问题讨论】:
-
这里有点混乱:你试图让编译器相信愚蠢的是一个带有 2 个类型参数的 Map 你不关心,但是你仍然使用映射类型为 Map
。但是您应该做的是测试该接口是否适用于您需要的任何类型组合。 -
如果你让它返回
pageMaps会发生什么?EasyMock.expect(config.getMap("sillyMap")).andReturn(pageMaps); -
我只关心它作为这个测试的 Map
,但这无关紧要。如果我无法将数据输入其中,我看不出如何“测试该接口是否适用于我需要的任何类型组合”。如果我使地图完全通用, put() 拒绝工作。 -
@JBNizet 这就是我所说的“当我真正使用 pageMaps 时”
标签: java generics easymock type-erasure