2016-10-10 1 views
6

java에서 이상한 것을 발견했습니다.조건부 할당에서 숫자 승격이 Java에서 작동하는 방법

코드 :

System.out.println(System.getProperty("java.version")); 
    System.out.println((true) ? (int)2.5 : 3.5); 
    System.out.println((true) ? (int)2.5 : 3); 
    System.out.println((true) ? (int)2.5 + "" : 3.5); 

결과 :

 
1.8.0_40 
2.0 
2 
2 

무엇입니까? false 값이 double이 아니거나 문자열 값이 true에 value에 추가 된 경우에만 정수 값이 반환되는 이유는 무엇입니까? 그게 버그 야?

답변

4

specification은 숫자 프로모션을 Java로 문서화합니다. 섹션 2에서 두 피연산자 중 하나가 double 유형이면 결과는 double 유형이라고합니다. (@Januson으로 첨가)이 specification, 그것은 설명한에서 해당 :

조건식의 종류

지금, 만일 제 AND 번째 오퍼랜드의 촉진 타입 이 두 문서를 예제에 적용하면 다음과 같이 표시됩니다.

System.out.println(System.getProperty("java.version")); 

Java의 버전 (릴리스)입니다. String입니다.

System.out.println((true) ? (int)2.5 : 3.5); 

이 경우 컴파일러는 조건부의 두 부분을보고 데이터 유형을 결정합니다. (int) 2.5는 integer이고 3.5는 double입니다. 결과는 double이됩니다. 따라서 정수 부분 2.5 (즉, 2)는 double으로 캐스팅됩니다. 결과는 integer 그래서이 경우

System.out.println((true) ? (int)2.5 : 3); 

컴파일러 2 개 정수 보인다. 첫 번째 경우는 integer이고 두 번째 경우는 integer이므로 결과는 integer입니다. 이 경우
System.out.println((true) ? (int)2.5 + "" : 3.5); 

그것이 String되고, 컴파일러는 첫 번째 경우에 보이는이 번호 문자열에 첨부되어 있기 때문에, 이제 2이다 정수부 걸린다. 결과는 문자열이 될 것입니다. 3.5를 반환하려고하면 double이 아닌 String으로 반환됩니다.

1

삼항 연산자가 반환 형식을 해결하는 방식 때문입니다. 자세한 내용은 specification을 확인하십시오.

첫 번째 표현은 2.5이기 때문에 처음 2를 int로 변환하지만 세 번째 인수가 두 배이며 INT는 다음 두 번 전체 표현 형식을 반환하는 컨버터블이기 때문에 int로 2.0

둘째 반환 symply INT 2 2.5 있기 때문에 더블 더블 반환 반환 유형은 int이고 2입니다.

세 번째로 먼저 2.5에서 2로 변환 한 다음 문자열 "2"로 변환하고 반환 유형은 String입니다.

관련 문제