0

これが私が持っているユーティリティメソッドです:

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
}

を通過すると、これが Boxed to であることがわかり5Object[]new Integer(5)ます。

どうすれば期待どおりの動作を得ることができますか?

編集

私が期待していること: テストで失敗したアサーションは合格します。それを達成するには、テスト対象のメソッドで何をすべきですか?:

4

2 に答える 2

3

プリミティブをオブジェクトとは異なるものとして定義しているため、プリミティブをオブジェクトとして扱うことはできません。オブジェクトの配列を持つことにより、その中のすべてがプリミティブではなくオブジェクトであることを保証します。


Anintはオブジェクトではないため、これを an に入れることはできません。そのため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);
}
于 2012-08-11T07:04:20.180 に答える
0

失敗する理由は、オブジェクトの配列があるためです。プリミティブ型の値int自動ボックス化されるIntegerため、配列Integerの 3 番目の位置に のインスタンスが含まれます。置き換えることでテストに合格することができます

assertTrue(classes[3].equals(int.class)); // Fails here

assertTrue(classes[3].equals(Integer.class));
于 2012-08-11T09:00:45.387 に答える