2012-08-11 3 views
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 
} 

내가 통과 5 내에서 Object[]이면 new Integer(5)으로 표시됩니다.

예상되는 동작을 어떻게 얻을 수 있습니까?

편집

내가 기대하고 무엇 : 내 테스트에 실패 주장은 전달합니다. 이를 달성하기위한 테스트 방법은 무엇을해야합니까? :

+0

항상 실패 테스트를

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

을 대체하여 테스트 통과를 할 수 있습니다 풀다)? –

답변

3

프리미티브를 개체로 처리 할 수없는 이유는 프리미티브를 개체와 다른 것으로 정의하기 때문입니다. 객체의 배열을 가짐으로써, 객체의 모든 것이 원시 객체가 아니라 원시 객체가되도록합니다. 당신이 new Integer(5)보다 더 효율적입니다 Integer.valueOf(5)를 호출하지만입니다 즉 그래서 컴파일러는 5. 당신이 값을 자동으로 상자에 코드를 생성 할 것 Object[]에 넣을 수 있도록 int


은 개체가 아닙니다 여전히 개체.

프리미티브에 .equals()을 호출 할 수 없으므로이 컴파일 사실은 사용자에게 알려주지 않습니다.

현재 int.class을 사용하면 int 클래스를 얻을 수 있습니다.

예상되는 동작을 어떻게 얻을 수 있습니까?

영어로 무엇을 기대하고 있습니까? 관심있는 사람들을 위해


는 자바 6 Integer.valueOf (int)에 대한 코드와 7

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); 
} 
+0

'primitive.class'와 같은 것이 있다는 것을 결코 알지 못했습니다! : 질문을 편집했습니다. - 당신이 설명하는 것은 내가 알고있는 것입니다 (오해가 있지만). 나는 그 질문의 마지막 단락에서 * bold *라고 말했다. - * "프리미티브에'.equals()'를 호출 할 수 없기 때문에이 컴파일 사실은 당신에게 알려주지 않습니다."* : 프리미티브에 없습니다.그것의 클래스에 ''. - * "당신이 영어로 기대하는 바를 정확하게 말할 수 있습니까?"* : 나는 분명히 그 질문을 편집했다고 생각했습니다. – Mohayemin

+0

* "... Integer.valueOf (5)'는'new Integer (5)'보다 더 효율적입니다."* - 안돼. 소스를 확인하여 첫 번째 소스가 두 번째 소스를 호출하는지 확인할 수 있습니다. – Mohayemin

+1

@ 모하메 인사 이것은 Java 5.0에서도 마찬가지입니다. –

0

실패 이유는 당신이 객체의 배열을 가지고있다. 프리미티브 유형 int의 값은 auto-boxedInteger으로 가져오고 배열에는 Integer의 인스턴스가 세 번째 위치에 포함됩니다. 당신은 당신이 원하는 할 (높은 수준에서 무엇을 실제 문제를 달성하기 위해 무엇을하려고하는 ...

assertTrue(classes[3].equals(Integer.class)); 
+0

테스트 케이스가 변경되도록하는 점은 무엇입니까? 또한 왜 작동하지 않는지 알 수 있습니다. 그리고 또한, [Peter의 대답] (http://stackoverflow.com/a/11912739/887149)은 이미 당신이 말한 것을 진술했습니다. – Mohayemin

+0

@ 모하메 민 당신은 시험 합격을하기 위해 무엇을해야하는지 질문했습니다. 나는 이것이 올바른 해결책이라고 믿습니다. 당신의 테스트가 그 곳에서 정확하지 않기 때문에 유일한 해결책은 그것을 교정하는 것입니다. Peter가 이미 언급했듯이, unboxed'int'를'Object []'에 넣을 수 없기 때문에, 당신이 무엇을 하든지 assertTrue (클래스 [3] .equals (int.class))는 항상 실패합니다. 'Object []'로부터 클래스의 배열을 생성 할 때. [내가 게시하기 전까지는 다른 답변에 대해 몰랐습니다.] –

관련 문제