programing

인수 또는 널이 전달되지 않은 경우 Java 3 도트 매개 변수 (varargs) 동작

copyandpastes 2021. 1. 15. 20:17
반응형

인수 또는 널이 전달되지 않은 경우 Java 3 도트 매개 변수 (varargs) 동작


나는 이것을 시도하고 JAVA에서 이상한 행동을 얻었습니다. 누군가 나를 위해 이것을 설명 할 수 있습니까?

boolean testNull(String... string) {
    if(string == null) {
        return true;
    } else {
        System.out.println(string.getClass());
        return false;
    }
}

boolean callTestNull(String s) {
    return testNull(s);
}

그런 다음 테스트 케이스가 있습니다.

    @Test
    public void test_cases() {
        assertTrue(instance.testNull(null)); // NULL
        assertFalse(instance.testNull()); // NOT NULL
        assertFalse(instance.callTestNull(null)); // NOT NULL
    }

내가 호출하는 경우 문제는 testNull()매개 변수를 사용하여 직접 null, 내가 얻을 것이다 true다시,하지만 전화하는 경우 callTestNull()와는 null, 어떤 전화 testNull(), 그것은 나를 알려주는 매개 변수가 null하지만, 빈 배열이 아닙니다.


문제는 내가 null 매개 변수를 사용하여 testNull ()을 직접 호출하면 true를 반환하지만 testNull ()을 호출하는 null로 callTestNull ()을 호출하면 매개 변수가 null이 아니라 빈 배열임을 알려줍니다.

예. 컴파일 타임 유형String인수를 사용하여 호출 하면 컴파일러는이 형식수 없음을 알고 String[]있으므로 문자열 배열 내에서 래핑합니다. 그래서 이건:

String x = null;
testNull(x);

다음과 같습니다.

String x = null;
testNull(new String[] { x });

이 시점에서 (잘못 이름이 지정된) string매개 변수는 널이 아닌 값을 가지게됩니다. 대신 유일한 요소가 널 참조 인 크기 1의 배열을 참조합니다.

그러나 null메서드 호출에서 리터럴을 직접 사용하면로 직접 변환 할 수 String[]있으므로 래핑이 수행되지 않습니다.

에서 JLS 섹션 15.12.4.2 :

호출되는 메소드가 가변 arity 메소드 m이면 반드시 n> 0 형식 매개 변수를 갖습니다. m의 최종 형식 매개 변수는 일부 T에 대해 반드시 T [] 유형을 가지며 m은 반드시 k ≥ 0 실제 인수 표현식으로 호출됩니다.

m이 k ≠ n 실제 인수 표현식으로 호출되거나 m이 k = n 실제 인수 표현식으로 호출되고 k 번째 인수 표현식 의 유형이 T []와 호환되는 할당이 아닌 경우 인수 목록 (e1, ..., en-1, en, ..., ek)는 (e1, ..., en-1, new | T [] | {en, ... , ek}), 여기서 | T [] | T []의 삭제 (§4.6)를 나타냅니다.

(강조 광산.)

내가 강조한 부분은 인수의 컴파일 타임 유형 이 null 유형이 아닌 경우 에만 래핑이 발생 하는 이유 String입니다.

참조 URL : https://stackoverflow.com/questions/17702807/java-3-dots-parameter-varargs-behavior-when-passed-no-arguments-or-null

반응형