인수 또는 널이 전달되지 않은 경우 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
입니다.
'programing' 카테고리의 다른 글
LRUCache를 사용하여 비트 맵을 언제 재활용해야합니까? (0) | 2021.01.15 |
---|---|
removeAllViews ()와 removeAllViewsInLayout ()의 차이점은 무엇입니까? (0) | 2021.01.15 |
setup.py의 entry_points / console_scripts와 스크립트의 차이점은 무엇입니까? (0) | 2021.01.15 |
ES6 수업은 왜 올리지 않나요? (0) | 2021.01.15 |
PDF 문서에서 텍스트를 추출하는 방법은 무엇입니까? (0) | 2021.01.15 |