如何共同处理基元和对象

时间:2012-08-11 06:44:45

标签: java reflection primitive autoboxing

这是我的实用方法:

public static Class<?>[] getTypes(Object[] objects){
    Class<?>[] types = new Class<?>[objects.length];

    for (int i = 0; i < objects.length; i++) {
        types[i] = objects[i].getClass();
    }

    return types;
}

以下是失败的测试用例

@Test
public void getTypesTest() {
    Object[] objects = {"String", new StringBuilder(), new Integer(5), 5};

    Class<?>[] classes = ReflectionUtils.getTypes(objects);
    assertTrue(classes[0].equals(String.class));
    assertTrue(classes[1].equals(StringBuilder.class));
    assertTrue(classes[2].equals(Integer.class));
    assertTrue(classes[3].equals(int.class)); // Fails here
}

当我在5内传递Object[]时,我意识到,这是封装为new Integer(5)

我怎样才能得到我期待的行为?

修改

我期待的是:在我的测试中失败的断言将通过。我应该怎样处理测试方法才能实现这个目标?:

2 个答案:

答案 0 :(得分:3)

您不能将基元视为对象,因为这是将基元定义为与对象不同的基元。通过拥有一个对象数组,您可以确保其中的所有内容都是对象,而不是原始对象。


int不是一个对象,因此您无法将其放在Object[]中,因此编译器将生成代码以自动将您的值设置为5.即它调用Integer.valueOf(5)这比new Integer(5)更有效,但仍然是一个对象。

你不能在原语上调用.equals(),所以这个编译的事实告诉你它不是。

顺便说一句,您可以使用int.class获取int的课程。

  

我怎样才能得到我期待的行为?

你能说出你对英语的期待吗?


对于那些感兴趣的人,Java 6和7中的Integer.valueOf(int)代码

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

答案 1 :(得分:0)

它失败的原因是你有一个对象数组。原始类型int的值为IntegerIntegerassertTrue(classes[3].equals(int.class)); // Fails here ,因此数组在第3位包含assertTrue(classes[3].equals(Integer.class)); 的实例。您可以通过替换

来进行测试
{{1}}

{{1}}