자바 모델 형식 지우 기

10427 단어 core자바
개술
『8195』는 지난 범례 블 로그 에서 주로 범례 의 기본 적 인 사용 과 디자인 을 설명 하고 본 블 로그 에서 범례 를 사용 하 는 데 가 져 온 문제 와 해결 방법 을 설명 했다.*8195:8195:자바 모델 을 사용 할 때 우 리 는 보통 많은 문제 에 부 딪 힐 수 있 습 니 다.예 를 들 어 T.class 를 사용 할 수 없고 T.method()를 직접 사용 할 수 없고 범례 매개 변 수 를 통 해 방법 을 다시 불 러 올 수 없습니다.이 모든 원인 은-'범례 유형 지우 기'로 귀 결 됩 니 다.
유형 지우 기
  jdk 1.5 이전 에는 범례 가 지원 되 지 않 았 다 는 것 을 알 고 있 습 니 다.List 를 예 로 들 면 List 에서 add()를 할 때 유형 검 사 를 하지 않 기 때문에 컴 파일 기간 에 어떤 유형의 대상 을 저장 하 더 라 도 컴 파일 오류 가 발생 하지 않 지만 실행 할 때 다른 유형 이 감지 되면 실 행 됩 니 다.범례 가 나타 나 면 컴 파일 단계 에서 저장 대상 의 유형 을 검사 하고 다른 유형 을 저장 하면 컴 파일 단계 에서 오 류 를 보고 합 니 다.그 러 니까 모델 은 운행 기 이상 을 컴 파일 기 이상 으로 전환 시 키 는 수단 이다.그 렇 기 때문에 모델 은 우리 가 소스 코드 를 쓸 때 만 유형 검사,유형 전환 등 작업 을 해 준다.컴 파일 이 끝 난 후에 운영 기간 에 어떠한 범례 문법 도 없다.이 소스 코드 에서 범례 를 제거 하 는 과정 은 바로 범례 의 유형 을 지 우 는 것 이다.
3.왜 범례 형식 으로 지 워 야 합 니까?
  사실은 말 하기 가 매우 간단 합 니 다.왜냐하면 지금까지 어떤 버 전의 jvm 도 운영 단계 에서 범례 를 지원 하지 않 았 기 때 문 입 니 다.그러나 범례 문법 은 실제 개발 에 있어 반드시 필요 합 니 다.많은 다른 언어 들 이 범례(예 를 들 어 C++의 템 플 릿,python 은 anything 으로 perform 범 형 방법 을 설명 하 는 등)자바 언어 가 뒤떨어 져 서 는 안 됩 니 다.그러나 역사적 인 원인 으로 인해...자바 는 버 전 1.0 에서 범 형 을 지원 하지 않 기 때문에 많은 기 존 라 이브 러 리 가 범 형 을 지원 하지 않 는 자바 버 전에 서 만 들 어 졌 다.후기 에 범례 를 넣 으 려 면 기 존의 비 일반화 라 이브 러 리 가 일반화 된 클 라 이언 트 에서 사용 할 수 있 도록 해 야 합 니 다.그래서 자바 개발 자 는 절충 하 는 방법 을 사 용 했 습 니 다.바로 지 우 는 것 입 니 다.구체 적 인 지우 기 과정 은 다음 과 같은 코드 를 보십시오.
class User<T extends Fruit> {
     public T work(T t){
         return null;
     }
}
class Fruit{}

class Apple extends Fruit{}

class Pear extends Fruit{}
class User {
     public Fruit work(Fruit t){
         return null;
     }
}

  우 리 는 범례 의 언어 가 제거 되 는 것 을 보 았 다.또한 범례 의 유형 은 가장 왼쪽 경계(최상 위 부류)로 제한 되 었 다.그러면 범례 의 유형 지우 기 과정 은 다음 과 같이 요약 할 수 있다.*8195°8195°2.모든 유형의 인 자 를 제거 합 니 다.  범 형 을 통 해 지 웁 니 다.문법 에 범 형 이 없 지만 운영 단계 에서 들 어 오 는 유형 을 Fruit 의 하위 클래스 로 제한 할 수 있 습 니 다.이것 이 바로 유형 지우 기 가 존재 하 는 의미 입 니 다.그러나 이렇게 간단 한 지우 기만 한다 면 다음 과 같은 코드 를 보십시오.
public interface Comparable<T> {
    public int compareTo(T o);
}

class User implements Comparable<User> {
    @Override
    public int compareTo(User o) {
        return 0;
    }
}
public interface Comparable {
    public int compareTo(Object o);
}
class User implements Comparable {
    public int compareTo(Object o) {
        return compareTo((User)o);
    }
    public int compareTo(User o){
    }
}
        ,Comparable        ,compareTo     Object  ,  User compareTo    User  ,     Overwrite  ,          Object       ,        。

4.범례 유형 지우 기 가 가 져 온 문제 및 해결 방법
1.범례 를 가 져 올 수 없 는 class
class User{
    public void eat(){
        this.printClass(T.class);//      ,      ,   T       。
    }
    private void printClass(Class clazz){
        System.out.println(clazz);
    }
}

  이 문 제 를 해결 하기 위해 저희 가 자주 사용 하 는 방법 은 RTTI,즉 Run-Time Type Identification 을 사용 하 는 것 입 니 다.운행 시 유형 식별 을 통 해 구체 적 인 코드 는 다음 과 같 습 니 다.
class User{
    private Class clazz;

    public User(Class clazz){
        this.clazz = clazz;
    }

    public void eat(){
        this.printClass(clazz);
    }

    private void printClass(Class clazz){
        System.out.println(clazz);
    }

    public static void main(String[] args){
        User u = new User(Fruit.class);
        u.eat();
    }
}

  우리 가 User 를 실례 화 할 때 반드시 범 형의 class 도 들 어가 야 한다.이렇게 하면 해결 할 수 있다.사실은 많은 범 형 dao 디자인 이 바로 이런 사고방식 이다.
2.범례 방법 을 직접 호출 할 수 없습니다.
class User{
    public void eat(T t){
       t.weight();//      ,      ,  T Object    weight  ,
    }
}

  여기 서도 하나의 절충안 만 사용 할 수 있 습 니 다.우 리 는 T 를 특정한 유형의 하위 클래스 로 한정 할 수 있 습 니 다.이렇게 하면 부모 클래스 의 방법 을 호출 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다.
class User<T extends Fruit>{
    public void eat(T t){
       t.weight();
    }
}

  위의 코드 는 틀 리 지 않 습 니 다.유형 은 지 워 지지 만 유형 은 Fruit 로 한정 되 며 fruit 는 weight 방법 을 가지 고 있 습 니 다.
3.패 러 다 임 을 통 해 리 셋 할 수 없 음
class User{
    //        ,      ,     List      ,        List  
    public void eat(List list){}

    public void eat(List list){}

}

  이런 eat 방법 은 List 에 들 어 갈 수도 있 고 List 에 들 어 갈 수도 있 기 를 바 라 는 것 일 것 입 니 다.이 문 제 를 해결 하려 면 마스크 를 사용 하 세 요.마스크 는 지난 블 로그 에 도 소개 되 어 있 고 모 르 는 것 은 볼 수 있 습 니 다.코드 는 다음 과 같 습 니 다:
class User{

    public void eat(List extends Fruit> list){

    }

    public static void main(String [] args){
        User u = new User();
        List applist = new ArrayList();
        u.eat(applist);

        List pearList = new ArrayList();
        u.eat(pearList);
    }
}

『8195』는 마스크 방식 을 통 해 상기 문 제 를 해결 했다.
4.범용 클래스 의 정적 변 수 는 공 유 됩 니 다.
public class StaticTest{
    public static void main(String[] args){
        User gti = new User();
        gti.var=1;
        User gts = new User();
        gts.var=2;
        System.out.println(gti.var);
    }
}
class User{
    public static int var=0;
    public void nothing(T x){}
}

출력 결과-2!형식 지우 기 를 통 해 모든 범 형 인 스 턴 스 는 같은 바이트 코드 와 연결 되 어 있 기 때문에 범 형 류 의 모든 정적 변 수 는 공 유 됩 니 다.물론 유형 지우 기 에 따 른 문제 가 많 으 니 일일이 열거 하지 않 는 다.
총화
  모델 은 자바 인 코딩,특히 디자인 에서 자주 사용 하 는 문법 입 니 다.디자인 과정 에서 발생 하 는 문 제 를 해결 하려 면 jvm 가 모델 을 처리 하 는 과정 을 깊이 이해 해 야 합 니 다.본 블 로그 가 여러분 에 게 유용 하 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기