자바 의 범 형 / 범 형

7570 단어
위 키 백과 에서 자바 범 형 에 대한 설명
자바 범 형의 인 자 는 클래스 만 대표 할 수 있 고 개별 대상 을 대표 할 수 없습니다.자바 범 형의 유형 매개 변수의 실제 유형 은 컴 파일 할 때 제거 되 기 때문에 실행 할 때 유형 매개 변수의 유형 을 알 수 없고 기본 값 형식 을 범 형 매개 변수 로 직접 사용 할 수 없습니다.자바 컴 파일 러 는 범 형 을 컴 파일 할 때 자동 으로 형식 변환 인 코딩 을 추가 하기 때문에 범 형 을 사용 해서 실행 속도 가 빨 라 지지 않 습 니 다.
실행 할 때 일반적인 대상 인 스 턴 스 유형 정보 등 결함 을 없 애 는 것 이 자주 지적 되 기 때문에 자바 및 JVM 의 개발 에 도 이 문 제 를 해결 하려 고 시도 한다. 예 를 들 어 자바 는 바이트 코드 를 생 성 할 때 유형 유도 보조 정 보 를 추가 하여 반사 인 터 페 이 스 를 통 해 일부 일반적인 정 보 를 얻 을 수 있다.JVM 에서 의 범 형 개선 을 통 해 기본 값 유형 범 형 을 지원 하고 범 형 정 보 를 직접 얻 을 수 있 도록 합 니 다.
자바 는 개별 범 형의 유형 매개 변 수 를 제약 할 수 있 습 니 다. 다음 과 같은 두 가지 형식 (가설 T 은 범 형의 유형 매개 변수 이 고 C 은 일반 류, 범 류 또는 범 형의 유형 매개 변수 입 니 다) 을 포함 합 니 다.
  • T 인터페이스 실현 I.
  • TC 또는 계승 C 이다.

  • 범용 since jdk 1.5
    에서 따 온 범 형의 본질은 매개 변수 화 유형 이 고 조작 한 데이터 유형 은 하나의 매개 변수 로 지정 된다.자바 의 범 형 은 컴 파일 러 에서 이 루어 지 는 것 이지 가상 컴퓨터 에서 이 루어 지 는 것 이 아니 라 가상 컴퓨터 는 범 형 에 대해 아무것도 모른다.따라서 컴 파 일 러 는 반드시 범 형 류 를 일반 류 로 수정 해야만 가상 컴퓨터 에서 운행 할 수 있다.자바 에 서 는 이 기술 을 지우 기 라 고 부 르 며, 일반적인 코드 는 지우 기 를 거 쳐 원생 유형 으로 변 한다.
    소스 코드 > > > 일반 형 > > 컴 파일 러 > > > 바이트 코드 (*. class 파일) > > > JVM (클래스 로 더, 바이트 코드 검사 기, 해석 기) > > > 운영 체제 플랫폼
    일반적인 장점 을 사용 하 다.
    유형 안전 및 유형 변환 필요 없 음
    유형 보안: 우 리 는 범 형 에 한 가지 유형의 대상 만 저장 할 수 있 습 니 다.그것 은 다른 대상 을 저장 할 수 없다.따라서 유형 전환 도 필요 없다.다음은 범 형 을 사용 하 는 것 과 범 형 을 사용 하지 않 는 것 의 차 이 를 보 여 준다.
    List list = new ArrayList();  
    list.add("Hello Generics");  
    String s = (String) list.get(0);  //      
    
    List list = new ArrayList();  
    list.add("Hello Generics");  
    String s = list.get(0);   //       
    

    형식 검사 가 실 행 될 때 컴 파일 로 이동 할 때
    컴 파일 시 검사: 컴 파일 할 때 검사 하기 때문에 실행 할 때 문제 가 발생 하지 않 습 니 다.좋 은 프로 그래 밍 전략 은 컴 파일 할 때 이 문 제 를 처리 하 는 것 이 실행 할 때 보다 훨씬 좋다 는 것 을 나타 낸다.
    일반적인 주의사항 사용
  • static 방법 에서 범 형 을 사용 할 수 없고 범 형 변수 도 static 키 워드 를 사용 하여 수식 할 수 없다
  • 범 형 상용 기호의 의미 - T (Type), K (Key), V (Value), E (Element), N (Number) 은 다른 형식 도 변수의 기호 로 사용 할 수 있 지만 우 리 는 이 몇 가지 기 호 를 사용 하 는 습관 이 있다.
  • 범 형 은 대상 에 만 적용 되 고 기본 유형 은 적용 되 지 않 지만 기본 유형의 포장 류 를 사용 하여 실현 할 수 있다. 예 를 들 어
  • List intList = new ArrayList();
    intList.add(1);  //   1   Integer
    intList.add(2);
    

  • 개발 자 들 은 범 형 을 사용 할 때 자신의 직관 에 따라 실 수 를 하기 쉽다.예 를 들 어 하나의 방법 이 List 를 형식 매개 변수 로 받 아들 이면 하나의 List 의 대상 을 실제 매개 변수 로 전송 하려 고 시도 하지만 컴 파일 을 통 해 전달 할 수 없 음 을 발견 합 니 다.직관 적 으로 오 브 젝 트 는 String 의 부류 이지 만 이런 유형의 전환 은 합 리 적 이 어야 한다.그러나 실제로는 함 축 된 유형 전환 문제 가 발생 하기 때문에 컴 파 일 러 는 이런 행 위 를 직접 금지한다.http://www.infoq.com/cn/articles/cf-java-generics

  • 일반적인 사용 예
    매개 변수 화 형식 만 들 기 - 일반 클래스
    //simple
    class MyGen {
        T obj;
    
        void add(T obj) {
            this.obj = obj;
        }
    
        T get() {
            return obj;
        }
    }
    
    public class Generics {
    
        public static void main(String args[]) {
            MyGen m = new MyGen();
            m.add(2);
            //m.add("test");   //Compile time error
            System.out.println(m.get());
        }
    }
    
    //complex from agile java
    import java.util.*;
    public class MultiHashMap  {
       private Map> map = new HashMap>();
    
       public static ,V> List
             sortedKeys(MultiHashMap map) {
          List keys = new ArrayList();
          keys.addAll(map.keys());
          Collections.sort(keys);
          return keys;
       }
    
       public Set keys() {
          return map.keySet();
       }
    
       public int size() {
          return map.size();
       }
    
       public void put(K key, V value) {
          List values = map.get(key);
          if (values == null) {
             values = new ArrayList();
             map.put(key, values);
          }
          values.add(value);
       }
    
       public List get(K key) {
          return map.get(key);
       }
    
       protected Set>> entrySet() {
          return map.entrySet();
       }
    
       public interface Filter {
          boolean apply(T item);
       }
    
       public static  void filter(final MultiHashMap target,
                                       final MultiHashMap source,
                                       final Filter super V> filter) {
          for (K key : source.keys()) {
             final List values = source.get(key);
             for (V value : values)
                if (filter.apply(value))
                   target.put(key, value);
          }
       }
    }
    

    일반적인 방법
    public class Generics {
    
        public static < E > void printArray(E[] elements) {  
            for ( E element : elements){          
                System.out.println(element );  
             }  
             System.out.println();  
        }  
        public static void main( String args[] ) {  
            Integer[] intArray = {6, 66, 666};  
            String[] stringArray = { "6","66","666" };  
      
            System.out.println( "Printing Integer Array" );  
            printArray( intArray  );   
      
           System.out.println( "Printing String Array" );  
            printArray( stringArray );   
        }   
    }
    

    상한 선
    모든 유형의 매개 변 수 는 Object 로 결 성 된 상한 선 이 있 습 니 다. 유형 매개 변 수 를 서로 다른 상한 선 으로 제한 할 수 있 습 니 다.이것 은 extends 키 워드 를 사용 하여 특정한 유형의 매개 변수의 상한 선 을 지정 해 야 합 니 다.
    //from agile java
    import java.util.*;
    public class EventMap
       extends MultiHashMap {
       public List getPastEvents() {
          List events = new ArrayList();
          for (Map.Entry> entry: entrySet()) {
             K date = entry.getKey();
             if (hasPassed(date))
                events.addAll(entry.getValue());
          }
          return events;
       }
    
       private boolean hasPassed(K date) {
          Calendar when = new GregorianCalendar();
          when.setTime(date);
          Calendar today = new GregorianCalendar();
          if (when.get(Calendar.YEAR) != today.get(Calendar.YEAR))
             return when.get(Calendar.YEAR) < today.get(Calendar.YEAR);
          return when.get(Calendar.DAY_OF_YEAR) <
             today.get(Calendar.DAY_OF_YEAR);
       }
    }
    

    마스크 와 일 드 카드
    자바 에서 어댑터 를 사용 할 수 있 습 니까?임의의 가능 한 유형 을 표시 합 니 다. 또한 extends 자 구 를 사용 하여 마스크 의 상한 선 을 제한 할 수 있 습 니 다.
    import java.util.ArrayList;
    import java.util.List;
    
    abstract class Shape {
        abstract void draw();
    }
    
    class Rectangle extends Shape {
        void draw() {
            System.out.println("drawing rectangle");
        }
    }
    
    class Circle extends Shape {
        void draw() {
            System.out.println("drawing circle");
        }
    }
    
    public class Generics {
        // creating a method that accepts only child class of Shape
        public static void drawShapes(List extends Shape> lists) {
            for (Shape s : lists) {
                s.draw(); // calling method of Shape class by child class instance
            }
        }
    
        public static void main(String args[]) {
            List list1 = new ArrayList();
            list1.add(new Rectangle());
    
            List list2 = new ArrayList();
            list2.add(new Circle());
            list2.add(new Circle());
    
            drawShapes(list1);
            drawShapes(list2);
        }
    }
    
    

    demo 원본
  • https://www.javatpoint.com/generics-in-java
  • agile java
  • 좋은 웹페이지 즐겨찾기