反射不尊重地图的通用类型吗?

时间:2018-11-09 14:37:40

标签: java reflection java-7

今天工作时,我偶然遇到了类似于下面的测试类所重复的情况。测试类中的测试使用具有两个映射的目标对象,一个是通用类型StringString,另一个是类型IntegerInteger。使用反射性调用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仅将指向其他对象的指针存储在其他位置,所以任何已定义的泛型类型仅仅是开发人员的限制,而不是代码本身的实际执行?

0 个答案:

没有答案