자바 범 형 독서 노트(1)

자바 범 형
자바 SE7 과 그 후의 버 전에 서 new 의 일반적인 인 스 턴 스 를 사용 할 때 형식 매개 변 수 를 입력 하지 않 을 수 있 습 니 다.자바 컴 파일 러 는 부 여 된 변수 형식 성명 을 통 해 다음 코드 를 추정 할 수 있 기 때 문 입 니 다.
ArrayList<String> files = new ArrayList<>();

컴 파 일 러 는 자동 으로 String 을 Array List 의 일반적인 클래스 인자 에 전달 합 니 다.
범 형 류 는 일반 류 의 한 공장 으로 나타 나 는데 범 형 류 는 서로 다른 유형의 매개 변 수 를 전달 함으로써 서로 다른 종 류 를 생산 할 수 있다.
일반 형식의 경계
다음 코드 를 사용 하여 범용 T 의 경 계 를 정의 할 수 있 습 니 다.
<T extends BoundingType>

여기 서 T 확장 자 를 Bounding Type 에서 정의 합 니 다.이 Bounding Type 은 인터페이스 일 수도 있 고 클래스 일 수도 있 습 니 다.
하나의 형식 매개 변수 나 어댑터?다음 코드 와 같은 여러 개의 경계 가 있 을 수 있 습 니 다.
T extends Comparable & Serializable

서로 다른 경 계 는&기 호 를 사용 하여 분리 되 고 이런 경계 중 하 나 는 클래스 일 수 있 으 며 다른 것 은 모두 인터페이스,즉 자바 의 계승 체제 와 같다.또한 하나의 클래스 를 경계 로 한다 면 extends 뒤의 첫 번 째 위치 에 쓰 고 뒤에 인 터 페 이 스 를 써 야 합 니 다.
범용 매개 변수 지우 기
일반적인 형식 을 정의 할 때 자바 는 자동 으로 원본 형식 을 제공 합 니 다.이 원본 형식의 이름 은 일반적인 이름 이 없 으 며 자바 컴 파일 러 는 형식 매개 변 수 를 지우 고 일반 형식 으로 변 합 니 다.
일반 형식 T 가 경 계 를 정의 하지 않 으 면 Object 로 바 꾸 는 것 이 원칙 입 니 다.경계 가 있 으 면 경계 로 교체 합 니 다.
다음 코드 는 Pair의 정의 입 니 다.
public class Pair<T>
{
    private T second;
    private T first;

    public Pair()
    {
        first = null;
        second = null;
    }

    public Pair(T first, T second)
    {
        this.first = first;
        this.second =second;
    }

    public T getFirst()
    {
        return first;
    }

    public T getSecond()
    {
        return second;
    }

    public void setFirst(T newValue)
    {
        first = newValue;
    }

    public void setSecond(T newValue)
    {
        second = newValue;
    }
}

컴 파 일 러 는 형식 을 지우 고 아래 의 일반 클래스 로 변경 합 니 다.
public class Pair
{
    private Object second;
    private Object first;

    public Pair()
    {
        first = null;
        second = null;
    }

    public Pair(Object first, Object second)
    {
        this.first = first;
        this.second =second;
    }

    public Object getFirst()
    {
        return first;
    }

    public Object getSecond()
    {
        return second;
    }

    public void setFirst(Object newValue)
    {
        first = newValue;
    }

    public void setSecond(Object newValue)
    {
        second = newValue;
    }
}

경계 가 있 는 일반적인 클래스 에 대해 다음 코드 와 같은 여러 경계 가 있 으 면 자바 컴 파일 러 는 첫 번 째 경계 로 자동 으로 지 워 집 니 다.
public class Interval<T extends Comparable & Serializable> implements Serializable
{
    private T lower;
    private T upper;

    ...

    public Interval(T first, T second)
    {
        if (first.compareTo(second) <= 0)
        {
            lower = first;
            upper = second;
        }
        else
        {
            lower = second;
            upper = first;
        }
    }
}

형식 지우 기 를 한 후에 위의 코드 는 첫 번 째 경계 Comparable 로 지 워 집 니 다.실제 자바 가상 컴퓨터 에서 코드 는 이 모양 입 니 다.
public class Interval implements Serializable
{
    private Comparable lower;
    private Comparable upper;

    ...

    public Interval(Comparable first, Comparable second)
    {
        ...
    }
}

위의 코드 가 경계 순 서 를 바 꾸 면:
<T extends Serializable & Comparable>

그러면 컴 파일 러 는 Serializable 로 지 워 지고 컴 파일 러 는 필요 한 곳 에 강제 형식 변환 문 구 를 자동 으로 추가 하여 Serializable 을 Comparable 로 변환 합 니 다.
public class Interval implements Serializable
{
    private Serializable lower;
    private Serializable upper;

    ...

    public Interval(Serializable first, Serializable second)
    {
        if (((Comparable)first).compareTo((Comparable)second) <= 0)
        {
            lower = first;
            upper = second;
        }
        else
        {
            lower = second;
            upper = first;
        }
        ...
    }
}

마찬가지 로 일반적인 방법 에 대해 서도 지 워 야 합 니 다.다음 과 같은 코드 입 니 다.
public static <T extends Comparable> T min(T[] a)

컴 파 일 러 에 의 해 지 워 지 는 것 은:
public static Comparable min(Comparable[] a)

주의:
하나의 방법의 반환 유형 이 범 형 일 때 지우 기 메커니즘 으로 인해 실제 적 으로 Object 나 경계 유형 으로 돌아 가면 컴 파일 러 는 자동 으로 유형 변환 문 구 를 추가 하여 지 워 진 대상 을 정상 적 인 대상 유형 으로 변환 합 니 다.
다음 코드 와 같이:
Pair<Employee> buddies = ...
Employee buddy = buddies.getFirst();

실제로 형식 이 지 워 지면 buddies.getFirst()는 Employee 형식의 인 스 턴 스 가 아 닌 Obecject 형식 으로 되 돌아 가 고 컴 파일 러 는 자동 으로 형식 장 치 를 추가 하여 Object 를 Employee 로 변환 합 니 다.
요약:
일반적인 방법 을 호출 할 때 컴 파일 러 는 하나의 호출 문 구 를 두 단계 로 나 누 어 집행 한다.
  • 원시 유형 Pair.getFirst 방법 을 호출 합 니 다
  • Object 유형 을 Employee 유형 으로 변환 합 니 다
  • 좋은 웹페이지 즐겨찾기