자바 범 형의 유형 지우 기 예시 상세 설명

머리말
자바 범 형 이라는 특성 은 JDK 1.5 에서 시작 되 었 기 때문에 이전 버 전 을 호 환 하기 위해 자바 범 형의 실현 은 문법 적 으로 범 형 을 지원 하지만 컴 파일 단계 에 서 는 이른바'유형 지우 기'(Type Erasure)를 하 는'위 범 형'전략 을 채택 했다.모든 범 형 표시(괄호 안의 내용)를 구체 적 인 유형(그 에 대응 하 는 원생 태 유형)으로 바 꾸 는 것 은 범 형 이 전혀 없 는 것 과 같다.유형 지우 기 를 이해 하 는 것 은 범 형 을 잘 사용 하 는 데 도움 이 된다.특히'난치병'으로 보 이 는 문제 들 은 유형 지우 기 를 이해 하면 쉽게 풀 린 다.
일반적인 유형 지우 기 원칙 은:
•형식 매개 변수 설명 을 제거 합 니 다.즉,<>와 그 포 위 된 부분 을 삭제 합 니 다.
•유형 매개 변수의 상하 계 에 따라 모든 유형 매개 변 수 를 원생 태 유형 으로 추정 하고 교체 합 니 다.유형 매개 변수 가 무제 한 어댑터 이거 나 상하 계 한정 이 없 으 면 Object 로 교체 합 니 다.상하 계 한정 이 존재 하면 하위 클래스 교체 원칙 에 따라 유형 매개 변수의 가장 왼쪽 한정 유형(즉,부모 클래스)을 추출 합 니 다.
•형식 안전 을 위해 필요 할 때 강제 형식 변환 코드 를 삽입 합 니 다.
•유형 을 지 운 후의 코드 가 여전히 일반적인'다 형 성'을 가지 도록'브리지 방법'이 자동 으로 생 성 됩 니 다.
1 클래스 정의 의 형식 매개 변 수 를 지 웁 니 다.
1.1 무제 한 형식 지우 기
클래스 정의 의 형식 매개 변수 가 제한 이 없 을 때 형식 지우 기 에서 Object 로 직접 대 체 됩 니 다.즉,와 같 습 니 다.의 형식 매개 변 수 는 모두 Object 로 바 뀌 었 습 니 다.1 참조.

그림 1:클래스 정의 의 형식 매개 변 수 를 지 웁 니 다.
1.2 제한 유형 지우 기
클래스 정의 의 유형 매개 변수 에 제한(상하 계)이 있 을 때 유형 지우 기 에서 유형 매개 변수의 상계 나 하계 로 바 꿉 니 다.예 를 들 어의 형식 매개 변 수 는 Number,Object 로 바 뀌 었 습 니 다.2 참조.

그림 2:클래스 정의 에 제 한 된 형식 매개 변 수 를 지 웁 니 다.
2 지우 기 방법 정의 의 형식 매개 변수
지우 기 방법 정의 의 유형 매개 변수 원칙 과 지우 기 클래스 정의 의 유형 매개 변 수 는 같 습 니 다.지우 기 방법 정의 에 있 는 제한 유형 매개 변 수 를 예 로 들 면 3 참조.

그림 3:일반적인 방법의 유형 적 인 파 라 메 터 를 지 웁 니 다.
3.브리지 방법 과 범 형의 다 형
다음 코드 를 고려 하 십시오:

public interface Info&lt;T&gt; {
    // just return var:-) 
    T info(T var); 
}
public class BridgeMethodTest implements Info&lt;Integer&gt; {
    @Override
    public Integer info(Integer var) {
        return var;
    }
}

우리 의 이전 유형 에 따라 유형 을 지 운 후의 코드 는 이렇게 해 야 합 니 다.

public interface Info {
    // just return var
    Object info(Object var);
}

public class BridgeMethodTest implements Info {
    @Override
    public Integer info(Integer var) {
        return var;
    }
}

그러나 유형 을 지 운 코드 는 문법 적 으로 잘못된 것 임 을 알 수 있 습 니 다.BridgeMethodTest 류 에는 info 방법 이 존재 하지만 Info 인터페이스 가 덮어 쓰 라 는 info 방법 과 일치 하지 않 습 니 다.매개 변수 유형 이 일치 하지 않 습 니 다.이러한 상황 에서 자바 컴 파일 러 는 이른바'브리지 방법'(bridge method)을 자동 으로 추가 하여 자바 문법 에 대한 요 구 를 만족 시 키 는 동시에 범 형 을 바탕 으로 하 는 다 형 이 효과 적 이라는 것 도 보장 한다.BridgeMethodTest.class 파일 을 역 컴 파일 하면 자바 컴 파일 러 가 어떻게 하 는 지 볼 수 있 습 니 다.

$ javap BridgeMethodTest.class 

Compiled from “BridgeMethodTest.java”

public class BridgeMethodTest implements Info<java.lang.Integer> {

public BridgeMethodTest();

public java.lang.Integer info(java.lang.Integer);

public java.lang.Object info(java.lang.Object);

}
이 를 통 해 알 수 있 듯 이 자바 컴 파일 러 는 BridgeMethodTest 에서 두 가지 방법 을 자동 으로 추가 했다.기본 구조 방법 과 매개 변 수 는 Object 의 info 방법 이 고 매개 변 수 는 Object 의 info 방법 은 바로'브리지 방법'이다.어떻게'브리지'라 는 두 글 자 를 이해 합 니까?우 리 는 BridgeMethodTest 를 더욱 역 컴 파일 하여 보 겠 습 니 다.

// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.                                                          
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   BridgeMethodTest.java
 
 
public class BridgeMethodTest
    implements Info
{
 
    public BridgeMethodTest()
    {   
    }   
 
    public Integer info(Integer integer)
    {   
        return integer;
    }   
 
    public volatile Object info(Object obj)
    {   
        return info((Integer)obj);
    }   
}

info(Object)방법 은 하위 클래스 의 info(Integer)방법 을 호출 하여 부모 클래스 와 하위 클래스 의 다 리 를 놓 았 습 니 다.즉,info(Object obj)라 는 방법 은 부모 클래스 와 하위 클래스 를 연결 하 는 역할 을 하여 자바 의 다 형 태 를 일반적인 상황 에서 도 유효 하 게 합 니 다.
물론 우 리 는 범 형 을 바탕 으로 하 는 다 형 태 를 사용 할 때'브리지 방법'을 너무 많이 고려 하지 않 아 도 된다.자바 컴 파일 러 는 우리 가 모든 것 을 잘 관리 하 는 데 도움 을 줄 것 이다.
브리지 방법 에 대한 더 많은 정 보 는 JLS 의 관련 장 을 참고 할 수 있다.
총결산
자바 팬 타 입 지우 기 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 팬 타 입 지우 기 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
참고 자료
•http://docs.oracle.com/javase/tutorial/java/generics/index.html
•http://docs.oracle.com/javase/tutorial/extra/generics/index.html

좋은 웹페이지 즐겨찾기