今天工作时,我偶然遇到了类似于下面的测试类所重复的情况。测试类中的测试使用具有两个映射的目标对象,一个是通用类型String
和String
,另一个是类型Integer
和Integer
。使用反射性调用Field#set()
,我可以将一个值设置为另一个值,即使对于标准Map#put()
方法调用,由于它们属于不同的泛型类型,也无法做到这一点。 / p>
public class MapTest
{
class Target
{
public Map<String, String> stringMap;
public Map<Integer, Integer> intMap;
}
Target target = new Target();
@Before
public void setUp() throws Exception
{
target.stringMap = new HashMap<String, String>();
target.stringMap.put("Key1", "Value1");
target.intMap = new HashMap<Integer, Integer>();
target.intMap.put(1, 2);
}
@Test
public void test() throws Exception
{
System.out.println(target.stringMap);
System.out.println(target.intMap);
Target.class.getField("stringMap").set(target, target.intMap);
System.out.println(target.stringMap);
System.out.println(target.intMap);
assertEquals(target.stringMap, target.intMap);
}
}
标准输出:
{Key1=Value1}
{1=2}
{1=2}
{1=2}
我能做些什么?我原本希望会抛出某种异常-是否可以配置使其实现?
我的假设是,因为Map
仅将指向其他对象的指针存储在其他位置,所以任何已定义的泛型类型仅仅是开发人员的限制,而不是代码本身的实际执行?