IT

Java 6과 Java 7의 자동 언 박싱 차이점

lottoking 2020. 8. 8. 12:05
반응형

Java 6과 Java 7의 자동 언 박싱 차이점


Java SE 6과 Java SE 7 사이의 자동 언 박싱 동작의 차이에 주목했습니다.이 두 버전 간에이 동작의 변경 사항에 대한 문서를 수 없기 때문에 그 이유가 궁금합니다.

다음은 간단한 예입니다.

Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];

이것은 Java SE 7의 javac로 잘 진행됩니다. 그러나 컴파일러에 "-source 1.6"인수를 지정하면 마지막 줄에 오류가 발생합니다.

inconvertible types
found   : java.lang.Object
required: int

Java SE 6을 다운로드하여 외장 버전 6 컴파일러 (-source 옵션없이)를 구축했습니다. 위와 동일한 오류에 동의하고 제공합니다.

그래서 무엇을 제공합니까? 더 많은 실험을 통해 Java 6의 unboxing은 (컴파일 시간에) boxed type 인 값만 unboxing 할 수 있습니다. 예를 들어,이 두 버전 모두에서 작동합니다.

Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];

따라서 Java 6과 7 사이에서 unboxing 기능이 향상되어 값이 적절한 boxed 유형인지 (컴파일 시간에) 알지 못 한 번에 클래스 유형을 캐스팅하고 언 박스 할 수 있습니다. 그러나 Java 7이 나왔을 때 자바 언어 사양이나 블로그 게시물을 읽었을 때 변경 사항이 표시 변경 사항이 무엇인지,이 "기능"이 무엇인지 궁금합니다. ?

호기심 일뿐입니다. 변경으로 인해 "모르는"언 박싱이 비밀 수 있습니다.

Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];

이게 좋습니다. ClassCastException을 제공합니다.

이것에 대한 참조이 있습니까?


5.5 Java 7 JLS의 변환 변환 섹션 의 언어가 Java 5/6 JLS의 동일한 섹션과 비교하여 업데이트 된 것입니다. 아마도 허용 된 변환을 명확하게하기 위해서입니다.

자바 7 JLS라고

참조 형식의 식은 unboxing 변환에 의해 오류없이 기본 형식으로 캐스팅 변환 될 수 있습니다.

자바 5/6 :

참조 형식의 값은 unboxing 변환 (§5.1.8)을 통해 기본 형식으로 캐스팅 될 수 있습니다.

Java 7 JLS에는 참조 유형에서 기본 형식으로의 허용 된 변환 (이 테이블은 Java 5/6 JLS에 포함되지 않음)의 테이블 (표 5.1)도 포함되어 있습니다. 이것은 Unboxing을 사용하여 축소 참조 변환의 객체에서 원시적입니다.

이유는 이 이메일에 설명되어 있습니다 .

요점 : 사양. allow (Object) (int) 또한 (int) (Object)를 허용해야합니다.


당신이 옳습니다. 더 간단하게 말하면 :

Object o = new Integer(1234);
int x = (int) o;

이것은 Java 7에서 작동하지만 Java 6 이하에서는 오류가 발생합니다. 이상하게 도이 기능은 눈에게 문서화되어 있지 않습니다. 예를 들어 여기에 언급되지 않은 . 새로운 기능이 있는지 여부를 수정 (또는 새로운 버그?) 합니다. 관련 정보 및 토론을 참조하십시오 . 합의 는 원래 사양 모호함 을 지적하는 것으로 보이며 , 이는 JSR 292 (동적으로 입력 된 언어)의 구현에 중요했기 때문에 7에서 수정 된 자바 5/6에서 약간 부정확하거나 일관성이없는 구현 으로 이어졌습니다 .

자바 오토 박싱은 이제 더 많은 함정과 놀라움이 있습니다. 예를 들면

Object obj = new Integer(1234);
long x = (long)obj;

컴파일되지만 ClassCastException런타임에 실패 합니다. 대신 다음과 같이 작동합니다.

long x = (long)(int)obj;

참고 URL : https://stackoverflow.com/questions/16119638/differences-in-auto-unboxing-between-java-6-vs-java-7

반응형