문제

이 질문 "자가 옥싱은 왜 자바에서 일부 전화를 모호하게 만드는가?"

그러나 답변을 통해 캐스팅에 대한 많은 언급이 있으며 차이를 완전히 이해하는지 확실하지 않습니다.

누군가 간단한 설명을 제공 할 수 있습니까?

도움이 되었습니까?

해결책

복싱은 기본 유형을 참조 유형으로 변환 할 때 UN- 박스가 반대입니다. 캐스팅은 하나의 유형을 다른 유형으로 처리하기를 원할 때 원시 유형과 기준 유형 사이에서 암시 적 또는 명시 적 복싱 작업을 의미합니다. 그것이 명백 해야하는지 여부는 언어 기능입니다.

다른 팁

캐스팅 및 권투/Unboxing은 유형 및 명백한 (또는 실제) 변환과 관련이 있지만 권투/Unboxing은 기본 유형과 해당 래퍼 유형 간의 관계에 따라 다르지만 캐스팅은 명시 적 또는 암시 적 유형 변경에 대한 용어입니다. 더 일반적인 의미.

주조 두 가지 관련이지만 다른 의미가있는 일반적인 용어입니다.

  1. 한 유형의 값을 처리합니다 마치 다른 유형의 가치였습니다. 이 첫 번째 사용법의 두 가지 예는 다음과 같습니다.

    1.1. 그 수업을 감안할 때 B 수업을 연장합니다 A, 당신은 요청할 수 있습니다 myB 인스턴스 B 사례로 취급됩니다 A 글쓰기로 ((A) myB) 인스턴스에 대한 참조가있는 곳 A 나타날 수 있습니다. 이것은 실제로 새로운 인스턴스를 생성하지 않습니다 A.

    1.2. Java5 Pre-Java5 컬렉션은 모든 컨텐츠로 저장됩니다 Object; 이를 위해서는 일반적으로 컬렉션에서 객체를 검색 한 후 캐스트를 사용해야합니다. 예를 들어, 저장 한 경우 a String 안에 Map 그리고 길이를 얻기 위해 필요하면 다음과 같은 글을 쓸 것입니다. ((String) myMap.get(someKey)).length() 전화를 걸기 위해 캐스트가 필요한 곳 length 의 방법 String. 다시 말하지만, 이것은 새로운 것을 유발하지 않습니다 String 만들어집니다.

  2. 명시 적으로 변환 한 유형에서 다른 유형 (즉, 표현을 명시 적으로 변경). 이 두 번째 사용법의 예는 표현에 있습니다. ((int) (float_var + 0.5F)) 0.5 (부동 소수점 값을 생성)를 추가 한 다음 해당 값을 정수로 명시 적으로 변환하여 부동 소수점 변수를 반올림합니다. 결과 정수 값 (이후 (int) 캐스트)입니다 제작 내부 계산에 의해 다른 값에서.

슈퍼 클래스/서브 클래스 또는 인터페이스/구현기 관계 (위의 1 의미)가 있거나 두 유형이 원시 숫자 유형 (의미 2) 일 때 캐스팅을 수행 할 수 있습니다. 자세한 내용은 "확대"및 "좁아짐"을 찾을 수 있습니다.

권투 컨테이너 객체의 원시 유형을 래핑하는 것을 말하며, 일반적으로 객체가 있어야 할 때만 수행됩니다 (예 : 컬렉션에 값을 저장). 원시 및 래퍼 유형은 쌍으로 제공됩니다.

int      Integer
long     Long
boolean  Boolean
...      ...

Unboxing 단순히 객체 래퍼 내에서 원시 값을 검색하는 것을 의미합니다.

Java5 기간 동안 해당 래퍼 유형이 필요한 원시 값을 사용하는 표현식을 작성할 때 (예 : 정수를 컬렉션에 넣는 등) 컴파일러는 실제로 그 원시 값을 랩핑하는 코드의 자동으로 미끄러집니다. 마찬가지로 그것은 당신에게 랩핑 코드를 제공 할 것입니다.

따라서 (Java5 Pre-Java5에서) 작성하는 대신 다음과 같은 것입니다.

Map myMap = new HashMap();
...
myMap.put(someKey,Integer.valueOf(3));
...
int nextValue = (myMap.get(someKey)).intValue() + 1;

당신은 쓸 수 있습니다:

Map<KeyType,Integer> myMap = new HashMap<KeyType,Integer>();
...
myMap.put(someKey,3);
...
int nextValue = myMap.get(someKey) + 1;

복싱/Unboxing 코드는 컴파일러에 의해 삽입됩니다.

List<String> list = (List<String>)object;

캐스트입니다.

void doSomething(Integer i) { ... }
...
doSomeething(5);

자동 박스입니다.

Integer getSomething();
...
int i = getSomething();

자동 노출입니다.

Autoboxing은 Java 5에 도입되어 다음과 같은 코드를 방지했습니다.

map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));

이제 말할 수 있습니다.

map.put("ABC", 5);

더 쉬운 반면 - 당신이 무엇을하고 있는지 확실하지 않으면 약간의 함정이 있습니다.

권투는 정수 개체 내부의 int 프라임 값과 같은 컨테이너 내부에 값을 감싸고 있습니다.

캐스팅은 유형을 보는 방법입니다.

전자는 또 다른 종류의 가치를 생산하며 나중에는 이미 존재하는 가치를 취급하는 방법을 수정합니다.

원시 유형 사이의 주조를 제외하고는 실제로 표현을 수정합니다. (이것은 더 명확하게하지 않습니까?)

권투 및 Unboxing은 Java의 캐스트 유형으로, 래퍼 클래스 또는 역수, 예를 들어 부울에서 부울 (상자) 또는 부울 (Unbox)으로 캐스팅됩니다.

예를 들어 자바의 캐스트 유형 :

  • 정체 변환 (§5.1.1) 문자열로 문자열

  • 넓은 원시 변환 (§5.1.2) 바이트 to int

  • 좁은 원시 변환 (§5.1.3) int to byte

  • 넓은 참조 변환 (§5.1.5) 정수에 대한 정수

  • 좁은 기준 변환 (§5.1.6) 정수에 대한 숫자

  • 권투 변환 (§5.1.7) int to Integer

  • Unboxing 변환 (§5.1.8). int에 대한 정수

자서전 또는 오토 박스는 컴파일러가 귀하를 위해 권투/Unboxing 변환을 수행 할 때 발생합니다 (소스 코드에 캐스트 표현식으로 명시 적으로 나타나지 않음).

다음의 경우자가 옥싱 및 Unboxing을 적용 할 수 있습니까?

Long one = 10;
long two = 15;
Long three = 20;

if(one == three) //will this be unboxed or do we need to put a explicit
                 //condition like if(one.intValue() == three.intValue()) 
   System.out.println("Equal");
else 
   System.out.println("Not Equal");  


if(one == two) //will this be unboxed or do we need to put a explicit
               //condition like if(one.intValue() == two) 
   System.out.println("Equal");
else 
   System.out.println("Not Equal");  
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top