자바 의 일반적인 사용 방법 에 대한 간단 한 소개

12294 단어 자바범 형
뭐 공부 해요?
'범 형'은 말 그대로'범 지 의 유형'이다.우 리 는 일반적인 개념 을 제 공 했 지만 구체 적 으로 실 행 될 때 구체 적 인 규칙 으로 제약 할 수 있다.예 를 들 어 우리 가 사용 하 는 매우 많은 Array List 는 일반적인 유형 이다.Array List 는 집합 으로 각종 요 소 를 저장 할 수 있다.예 를 들 어 Integer,String,사용자 정의 의 각종 유형 등 이다.그러나 우리 가 사용 할 때 구체 적 인 규칙 을 통 해 제약 을 받는다.만약 우리 가 집합 에 Integer 형식의 요소 만 저장 하 는 것 을 제약 할 수 있다 면,예 를 들 어 ListiniData=new Array List<>().
2.범 형 을 사용 하면 무슨 좋 은 점 이 있 습 니까?
집합 으로 예 를 들 어 범 형 을 사용 하 는 장점 은 우리 가 요소 유형 이 다르다 고 해서 서로 다른 유형의 집합 을 정의 할 필요 가 없다 는 것 이다.예 를 들 어 정형 집합 류,부동 소수점 집합 류,문자열 집합 류 등 이다.우 리 는 하나의 집합 을 정의 하여 정형,부동 소수점 형,문자열 형 데 이 터 를 저장 할 수 있다.이것 은 가장 중요 한 것 이 아니다.우 리 는 바 텀 저장 소 를 Object 로 설정 하면 되 기 때문에 추 가 된 데 이 터 는 모두 Object 로 바 꿀 수 있 습 니 다.더 중요 한 것 은 우리 가 규칙 을 통 해 자신의 생각 에 따라 저 장 된 데이터 형식 을 제어 할 수 있다 는 것 이다.

우 리 는 Array List 를 예 로 들 면,만약 우리 가 이 달 까지 의 날 짜 를 Array List 에 넣 으 려 고 한다 면,만약 우리 가 일반적인 형식 을 사용 하지 않 는 다 면,이때 우 리 는 Array List 를 정의 합 니 다.

List monthDays = new ArrayList();
우 리 는 그 중 에 1 일부 터 4 일 까지 날 짜 를 넣 었 다.

public static List addMonthDays(){
 List monthDays = new ArrayList();
 monthDays.add(LocalDate.now().withDayOfMonth(1));
 monthDays.add(LocalDate.now().withDayOfMonth(2));
 monthDays.add(LocalDate.now().withDayOfMonth(3));
 monthDays.add(new Date());
 return monthDays;
}
이렇게 하면 문제 가 있 습 니까?여러분 도 알 아 보 셨 습 니 다.물론 있 습 니 다.모두 날 짜 를 표시 할 수 있 지만 Date,LocalDate 를 사 용 했 습 니 다.우 리 는 호출 방법 으로 직접 인쇄 했 습 니 다.바로 이 겁 니 다.

public static void main(String[] args) {
 List monthDays = addMonthDays();
 for(Object day : monthDays){
  System.out.println(day);
 }
}
2019-08-01
2019-08-02
2019-08-03
Sun Aug 04 10:27:10 CST 2019
우 리 는 분명히 이런 결 과 를 원 하지 않 을 것 이다.우리 가 원 하 는 것 은?
2019-08-01
2019-08-02
2019-08-03
2019-08-04
만약 에 저 장 된 요소 유형 이 이 두 가지(우리 가 알 고 있다 면)라면 이 럴 때 우 리 는 수 동 으로 판단 합 시다.

public static void main(String[] args) {
 List monthDays = addMonthDays();
 for(Object day : monthDays){
  if (day instanceof Date){
   Date date = (Date) day;
   System.out.println(LocalDate.of(date.getYear(), date.getMonth(), date.getDay()));
  }else {
   System.out.println(day);
  }
 }
}
이때 우 리 는 상술 한 목적 을 달성 할 수 있 지만,여러분 도 알다 시 피,이런 서법 문 제 는 매우 크다.
  • 우 리 는 저 장 된 요소 가 날짜 와 관련 이 있 는 지 여 부 를 제어 할 수 없다.예 를 들 어 우리 가'1',65536 등 비 날 짜 를 저장 하고 정 의 된 방법 도 잘못 보고 하지 않 지만 호출 하여 유형 전환 을 할 때 반드시 잘못 보고 할 것 이다.
  • 우 리 는 집합 에 도대체 어떤 유형의 요 소 를 저장 하고 있 는 지 모른다.예 를 들 어'2019/08/04'라 는 날짜 문자열,java.sql.Date 라 는 유형 이 있 는데 우 리 는 끝까지 할 수 있다 고 보장 하기 어렵다.
  • 코드 가 너무 복잡 해서 유지 하기 가 너무 어렵 습 니 다.
  • 이때 범 형 은 좋 은 해결 방안 을 제공 하고 원천 적 으로 규칙 을 제정 하여 LocalDate 유형 만 추가 하면 상기 문 제 는 모두 해결 할 수 있다.
    
    public static List<LocalDate> addFormatMonthDays(){
     List<LocalDate> monthDays = new ArrayList<>();
     monthDays.add(LocalDate.now().withDayOfMonth(1));
     monthDays.add(LocalDate.now().withDayOfMonth(2));
     monthDays.add(LocalDate.now().withDayOfMonth(3));
     monthDays.add(new Date());//               
     return monthDays;
    }
    코드 의 가 독성 을 높 였 을 뿐만 아니 라 우리 가 저장 한 것 이 LocalDate 유형 임 을 한눈 에 알 수 있다.이 동시에 컴 파일 러 도 이 정 보 를 잘 이용 할 수 있 고 컴 파일 기간 에 유형 검 사 를 할 수 있 으 며 안전성 을 확보 할 수 있 으 며 get 일 때 강제 유형 전환 을 하지 않 아 도 된다.
    범 형 류
    클래스 를 더 많은 상황 에 적응 시 키 고 더 좋 은 확장 성 을 가지 기 위해 우 리 는 이 를 일반적인 클래스 로 설정 할 수 있 습 니 다.즉,하나 이상 의 유형 변 수 를 가 진 클래스 입 니 다.쓰 는 방법 은 다음 과 같 습 니 다.
    
    public class ClassName<    ,     、     ,           > {
      private      property;
    }
    일반적인 식별 자 에 대해 일반적으로 약 속 된 표기 법 이 있 습 니 다.집합 을 나타 내 는 요소 유형 이 라면 보통 알파벳 E 를 사용 합 니 다.예 를 들 어 우리 가 자주 사용 하 는 Array List,Public class Array List와 같이 우 리 는 다음 과 같이 사용자 정의 합 니 다.
    
    //  
    public class Garage<E> {
      //       
      public void add(E car){
        //...
      }
    }
    우 리 는 또한 문자 K 와 V 로 키워드 와 값 의 유형 을 표시 할 수 있 습 니 다.예 를 들 어 우리 가 자주 사용 하 는 HashMap,Public class HashMap등 도 다음 과 같이 사용자 정의 할 수 있 습 니 다.
    
    //    
    //K,V:   ,    ;   ,  ;   ,  ;   ,  
    public class Mapping<K, V> {
      
      private K key;
      
      private V value;
    }
    우 리 는 또 하나의 문자 T 로 유형 을 표시 한다.
    
    public class Person<T> {
      private T t;
      public Person(T t){
        this.t = t;
      }
      public void run(){
        System.out.println(t);
      }
    }
    범 형 류 를 어떻게 사용 하 는 지,유형 을 어떻게 예화 하 는 지,우 리 는 들 어 오 는 실제 인삼 유형 과 범 형 매개 변수 유형 이 같 으 면 됩 니 다.
    
    //    
    Person<String> s1 = new Person<String>("  ");
    //jdk7.0            
    Person<String> s2 = new Person<>("  ");
    s2.run();
    
    //                       ,      ,       ,         
    Person t = new Person(111);
    t.run();
    
    //              ,       
    Person<int> s = new Person<>(1);
    범용 인터페이스
    범 형 인터페이스 와 범 형 류 의 정 의 는 기본적으로 일치 하 며 정 의 는 다음 과 같다.
    
    public interface Person<T> {
      public T parent();
      public String eat();
    }
    우리 가 이 인 터 페 이 스 를 실현 하려 는 종 류 를 정 의 했 을 때 이런 유형의 범 형 유형 은 반드시 인터페이스 류 의 범 형 유형 과 일치 해 야 한다.실 삼 을 전달 하지 않 은 상황 에서 범 형 유형 T 를 계속 사용 하고 실 삼 을 전달 한 상황 에서 범 형 유형 은 반드시 실 삼 유형 을 사용 해 야 한다.
    
    public class Teacher<T> implements Person<T> {
      @Override
      public T parent() {
        return null;
      }
    
      @Override
      public String eat() {
        return null;
      }
    }
    
    //Teacher        ,       Person       
    public class Teacher implements Person<Integer> {
      //          Integer,      
      @Override
      public Integer parent() {
        return null;
      }
    
      @Override
      public String eat() {
        return null;
      }
    }
    범 형 방법
    범 형 방법 은 일반 류 와 범 형 류 에서 정의 할 수 있다.예 를 들 어 범 형 류 는 더욱 자주 사용 된다.보통 범 형 방법 으로 해결 할 수 있 는 문 제 는 범 형 류 를 사용 하지 않 고 범 형 류 를 우선 사용 할 수 있다.유형 변 수 는 수정자 뒤에 놓 인 다.예 를 들 어 Public static,Public final 등 이다.
    
    public class Teacher {
      public static <T> T println(T t){
        System.out.println(t);
        return t;
      }
    }
    호출 은 매우 간단 하고 일반적인 방법 으로 호출 하 는 것 은 같 으 며 더욱 편리 한 것 은 유형 이 일반적인 방법 으로 한정 되 지 않 았 다 는 것 이다.
    
    String s = Teancher.println("str");
    또한 설명 이 필요 한 것 은 범 형 류 에서 의 범 형 방법 을 정의 하 는 범 형 변수 간 에는 관계 가 없다 는 것 이다.예 를 들 어 이러한 코드 는
    
    public class Teacher<T> {
      T teacher;
      public Teacher(T t){
        this.teacher = t;
      }
      public <T> T println(T t){
        System.out.println(t);
        return t;
      }
    }
    
    Teacher<String> teacher = new Teacher<>("  ");
    Integer in = teacher.println(123456);
    클래스 범 형 유형 은 String 이 고 방법의 범 형 유형 은 Integer 입 니 다.모두 T 로 표시 되 지만.
    동시에 범 형 방법 에 대해 설명해 야 할 것 은:
    수정자 Public xx 와 방법 명 사이 에서 매우 중요 합 니 다.가 있어 야 일반적인 방법 이 라 고 할 수 있 습 니 다.범 형 변수 만 사용 한 것 은 범 형 방법 이 아니다.
    6.유형 변수 한정
    범 형 류 든 범 형 방법 이 든 현재 로 서 는 유형 제한 이 없다.우리 가 어떤 유형의 변 수 를 전달 하 든 들 어가 도 된다.왜냐하면 우 리 는 처리 논리 에서 이 유형 특유 의 것(구성원 변수,방법 등)을 사용 하지 않 았 기 때문이다.만약 우리 가 전달 하고 자 하 는 매개 변수 유형 이 하나의 큰 클래스(아버지 클래스)아래 의 작은 클래스(하위 클래스)에 불과 하 다 면 어떻게 합 니까?
    
    public class ArrayFlag {
      public static <T> T getMax(T[] array){
        if(array == null || array.length == 0){
          return null;
        }
        T maxValue = array[0];
        for(int i = 0; i < array.length; i++){
          if(array[i].compareTo(maxValue) > 0){
            maxValue = array[i];
          }
        }
        return maxValue;
      }
    }
    getMax 방법 에서 compare To 방법 을 사용 하여 비교 하 는 것 을 보 셨 습 니 다.그러나 우리 가 들 어 오 는 유형 T 에 compare To 방법 이 없다 면 잘못 보고 해 야 하 는 것 이 아니 겠 습 니까?그래서 우 리 는 한정 을 해 야 합 니 다.Comparable 인터페이스 인 필연적으로 compare To 방법 을 갖 추 는 것 을 한정 하면 이렇게 됩 니 다.
    
    public class ArrayFlag {
      public static <T extends Comparable> T getMax(T[] array){
        if(array == null || array.length == 0){
          return null;
        }
        T maxValue = array[0];
        for(int i = 0; i < array.length; i++){
          if(array[i].compareTo(maxValue) > 0){
            maxValue = array[i];
          }
        }
        return maxValue;
      }
    }
    이 동시에 설명 해 야 할 것 은 여기 서 extends 키 워드 를 사용 합 니 다.extends 는 여기 서 Comparable 인터페이스 와 그 하위 유형 을 연결 하 는 것 을 의미 합 니 다.'바 인 딩,한정'이라는 뜻 입 니 다.'계승'이 아니 라 뒤에 도 인터페이스 나 클래스 가 있 을 수 있 습 니 다.여러 가지 제한 이 있 으 면&구분 을 사용 할 수 있 습 니 다.예 를 들 어:
    
    public static <T extends Comparable & Serializable> T getMax(T[] array)
    범용 어댑터
    예 를 들 어 책 류 와 소설 류 를 정의 했다.
    
    //        
    public class Book {}
    //               
    public class Novel extends Book {}
    우 리 는 책 과 소설 을 담 는 책장 류 를 다시 정의 했다.
    
    //            
    public class Bookcase<T> {
      T b; 
      public Bookcase(T t){
        this.b = t;
      }
      public void set(T t) {
        b=t;
      } 
      public T get() {
        System.out.println(b.getClass());
        return b;
      }
    }
    다음은 책장 으로 소설 을 담 겠 습 니 다.
    
    //     ,      ,  Incompatible types, Required Book Found Novel
    Bookcase<Book> bc = new Bookcase<Novel>(new Novel());
    그러나 jdk 7.0 이후 new Bookcase 는 일반적인 형식 을 제시 하지 않 아 도 되 고 생략 된 유형 은 변수의 유형 으로 추정 할 수 있 기 때문에 다음 과 같은 표기 법 이 있 으 면
    
    Bookcase<Book> bc = new Bookcase<>(new Novel());
    System.out.println(bc.getClass());
    bc.get();
    이 때 컴 파일 을 통과 할 수 있 습 니 다.우리 가 실행 한 결 과 는:
    
    class generic.Bookcase
    class generic.Novel
    물론 우 리 는 마스크 를 통 해 이 문 제 를 해결 할 수 있다.마스크 는 다음 과 같은 몇 가 지 를 포함한다.
    상계 어댑터,하계 어댑터,무한 정 어댑터
    7.1 상계 어댑터
    상계 어댑터 의 정의 방식 은 다음 과 같다.extends 키 워드 를 사용 하면 이 책장 에 소설 류 서적(예 를 들 어 도시 소설,사랑 소설,판 타지 소설 등)만 놓 을 수 있 지만 아버지 류 서적,다른 류,예 를 들 어 사서,직장 류 서적,재 경 류 서적 등 을 놓 을 수 없고 사용 할 때 한정 할 수 없다.예 를 들 어:
    
    Bookcase<? extends Book> bc = new Bookcase<Novel>(new Novel());
    이런 정의 방식 은 컴 파일 오류 가 없 을 것 이다.또한 상계 어댑터 의 특징 에 대해 서 는 상한 선 에 제한 이 있 으 며,자바 다 중 상 향 조형 원칙 에 따라 데 이 터 를 자주 삽입 하 는 것 은 적합 하지 않 으 며,데 이 터 를 자주 읽 는 장면 에 적합 합 니 다.
    7.2 하계 어댑터
    하계 어댑터 의 정의 방식 은 다음 과 같다.슈퍼 키 워드 를 사용 하면 책장 에 하한 선 을 두 었 다 는 뜻 이다.우 리 는 Book 서적 과 Novel 서적 만 놓 을 수 있 을 뿐 세분 화 된 도시 소설,사랑 소설 류 서적 은 넣 을 수 없다.
    
    Bookcase<? super Novel> bc = new Bookcase<Novel>(new Novel());
    또한 하계 어댑터 의 특징 은 상계 어댑터 와 정반 대로 데 이 터 를 자주 읽 기 에 적합 하지 않 고 데 이 터 를 자주 삽입 하 는 장면 에 적합 하 다.
    7.3 무한 정 어댑터
    무한 정 어댑터 는 모든 대상 을 사용 할 수 있 음 을 의미 하기 때문에 원생 유형 을 사용 하 는 것 과 유사 하 다.그러나 이 는 역할 을 한다.원생 유형 은 모든 유형 을 가 질 수 있 고 무한 정 마스크 로 장 식 된 용 기 는 특정한 구체 적 인 유형 을 가지 고 있다.
    예 를 들 어:
    
    List<?> list = new ArrayList<>();
    //      
    list.add(new Object());
    
    //              
    List<Object> list = new ArrayList<>();
    list.add(new Object());
    다시 한 번그 차이 점 은 처음에 보면 그들 은 모두 범 형 변 수 를 나 타 낼 수 있 고 extends 를 나 타 낼 수 있 는 것 같 지만 서로 다른 사용 장면 이 있다.
  • 유형 매개 변수는 범 형 류 또는 범 형 방법
  • 을 설명 합 니 다.
  • 무한 정 마스크범 형 류 나 범 형 방법 을 사용 하 다
  • 총화
    범 형 은 자바 에서 자주 사용 된다 고 할 수 있 습 니 다.우리 가 앞에서 언급 한 집합 류,예 를 들 어 Array List,HashSet,그리고 Map 은 모두 범 형 에 사용 되 었 습 니 다.범 형 도 우리 가 구성 요 소 를 포장 하 는 데 자주 사용 되 는 것 입 니 다.본 고 는 주로 범 형 기본 개념,범 형 을 사용 하 는 장점,범 형 류,인터페이스,방법,어댑터 의 간단 한 소개 와 사용 방법 을 소개 합 니 다.마지막 으로 범 형 일반 과 반사 집합 을 통 해 사용 할 수 있 습 니 다.범 형 을 통 해 유형의 유연 한 전달 을 할 수 있 습 니 다.반 사 를 통 해 실체 와 유형의 데이터 정 보 를 얻 을 수 있 고 일부 구조,구성 요소 의 포장 을 실현 할 수 있 습 니 다.잘못된 점 이 있 으 면 비판 하고 지적 하 며 공동으로 발전 하 시기 바 랍 니 다.감사합니다!
    자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기