서른둘

5672 단어
1. 일반적인 도입
앞에서 집합을 배울 때 우리는 집합에 임의의 대상을 저장할 수 있다는 것을 알고 있다. 대상을 집합에 저장한 후에 그들은 모두 Object 유형으로 향상될 것이다.우리가 모든 대상을 추출하고 해당하는 조작을 할 때 반드시 유형 변환을 사용해야 한다.예를 들어 다음 절차는 다음과 같습니다.
public class GenericDemo {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("abc");
        list.add("sxt");
        list.add(5);//           ,            
        Iterator it = list.iterator();
        while(it.hasNext()){
            //            ,            String  
            String str = (String) it.next();
            System.out.println(str.length());
        }
    }
}

프로그램이 실행될 때 문제가 발생했습니다java.lang.ClassCastException에서 유형 변환 예외가 발생한 이유는 무엇입니까?우리가 분석해 보자. 집합 중의 어떤 유형의 원소도 저장할 수 있기 때문이다.체크 아웃을 수행할 때 강제 회전이 발생하면 런타임 ClassCastException이 발생합니다.어떻게 이 문제를 해결합니까?집합을 사용할 때는 집합 중의 원소의 유형을 명확하게 해야 한다.이런 방식을 범형이라고 부른다.
2. 일반적인 정의와 사용
1. 범형류의 정의와 사용 : class { }
  • 예를 들어, API의 Array List 컬렉션:class Array List {public boolean add (E) {} public E get (int index) {}
  • : ,
  • 예: ArrayList list = new ArrayList();이 때 변수 E의 값은 String 유형입니다. class Array List {public boolean add (String e) {} public String get (int index) {}
  • 예: ArrayList list = new ArrayList();이 때 변수 E의 값은 Integer 유형입니다. class Array List {public boolean add (Integer e) {} public Integer get (int index) {}
  • 2. 일반적인 방법의 정의와 사용 : ( ){ }
  • 예를 들어 API의 Array List 집합 중의 방법:public T[] to Array(T[] a) {}//이 방법은 집합 요소를 지정한 데이터 형식의 그룹에 저장하고 집합된 요소의 그룹을 되돌려주는 데 사용한다
  • : ,
  • 예: ArrayList list = new ArrayList();String[] arr = new String[100]; String[] result = list.toArray(arr); 이때 변수 T의 값이 String 유형입니다.변수 T, 집합을 정의하는 일반 형식과 다른public String[] to Array(String[] a) {}
  • 예: ArrayList list = new ArrayList();Integer[] arr = new Integer[100]; Integer [] result = list.toArray(arr); 이제 변수 T의 값이 Integer 유형입니다.변수 T, 컬렉션을 정의하는 일반 유형과 다르게 public Integer[] toArray(Integer[] a) {}
  • 3. 일반 인터페이스의 정의와 사용 : interface { }
  • 예를 들어, API의 Iterator 교체기 인터페이스인public interface Iterator {public abstract E next ();

  • 사용 형식: 1、
  • 예를 들어, public final class Scanner implements Iterator {public String next () {}} 이때 변수 E의 값이 String 유형입니다.
  • 2、 , ,
  • 예: Collection list = new ArrayList();Iterator it = list.iterator(); 이때 변수 E의 값이 String 유형입니다.public interface Iterator { public abstract String next(); }

  • 3. 범용성을 사용하는 장점
  • 실행 중인 ClassCastException을 컴파일 시기로 옮겨 컴파일 실패로 변경합니다.
  • 유형 강전의 번거로움을 피했다.다음 코드를 보여 주십시오.
  • public class GenericDemo {
        public static void main(String[] args) {
            Collection list = new ArrayList();
            list.add("abc");
            list.add("sxt");
            //list.add(5);//        ,             
            //               ,           ,                 
            Iterator it = list.iterator();
            while(it.hasNext()){
        String str = it.next();
    //   Iterator       ,       。          String  
                System.out.println(str.length());
            }
        }
    }
    

    4. 반성 어댑터>
    범형은 데이터 형식을 한정하는 것이다. 집합이나 다른 곳에서 범형을 사용한 후에 이때 범형의 데이터 유형을 명확하게 하면 사용할 때 데이터 유형과 일치하는 유형만 전달할 수 있고 그렇지 않으면 오류가 발생할 수 있다.코드 데모:
  • 교체 집합 원소를 정의하는 방법
  • public static void printCollection(Collection list) {
        Iterator it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
    
  • 호출 방법Collection list = new ArrayList();printCollection(list); 위에서 호출한 방법 문장은 문법 오류에 속한다. 왜냐하면 범형 한정이 일치하지 않기 때문이다.방법은 Collection 형식이고, 전송된 것은 Collection이며, 양자 형식이 일치하지 않습니다.

  • 상기 정의된 printCollection 방법에서 정의된 것은 인쇄 집합 기능이기 때문에 임의의 집합 중의 요소를 인쇄할 수 있어야 한다.그러나 방법을 정의할 때 구체적인 집합 중의 원소 유형이 무엇인지 도무지 확정할 수 없다.이'구체적인 집합 중의 원소 유형을 확정할 수 없음'문제를 해결하기 위해java에서 우리에게 >를 제공하였다.위의 방법을 수정한 후, 임의의 원소 유형을 교체할 수 있는 집합을 실현하였다.
    public static void printCollection(Collection> list) {
        Iterator> it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
    

    총괄적으로 말하자면 범형 클래스나 인터페이스를 사용할 때 전달된 데이터 중 범형 유형이 확실하지 않으면 어댑터 > 를 통해 표시할 수 있다.그러나 범용 어댑터를 사용하면 Object 클래스의 공통 방법만 사용할 수 있고 집합의 원소 자체 방법은 사용할 수 없습니다.
    5. 범주형 한정
    상술한 인쇄 집합의 기능은 매우 강해 보이며 임의의 집합을 인쇄할 수 있지만 문제도 생겼다.인쇄된 집합의 요소 형식을 제한하려면 지정한 종류만 인쇄합니다.어떻게 할까?이 문제를 해결하려면 우리는 범형의 한정을 배워야 한다.
  • 한정 범위의 상한선: : extends E>
  • ? E 유형이나 E를 수신하는 하위 유형을 나타내는 요소. 예를 들어 범용은 다음과 같다.extends Person의 경우는?Person 유형 또는 Person 하위 유형을 수신하는 요소
  • 를 나타냅니다.
  • 한정 범위의 하한선: : super E>
  • ? E 형식이나 E를 받는 부모 형식을 대표하는 요소입니다. 예를 들어 범형은 다음과 같습니다:?extends Student 는?Student 유형 또는 Student 상위 유형을 수신하는 요소
  • 를 나타냅니다.

    실례: 학생과 노동자의 집합을 인쇄할 수 있도록 아래의 방법을 수정한다.
    class Student extends Person{ }
    class Worker extends Person{ }
    
    public static void printCollection(Collection> list) {
        Iterator> it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
    

    분석해 보면 학생과 노동자의 공통된 유형인 Person을 찾을 수 있다.그렇다면 범형의 한정은 이렇게 쓸 수 있다:?extends Person: Person 유형 또는 Person의 하위 유형을 받습니다.수정 방법은 다음과 같습니다.
    public static void printCollection(Collection extends Person> list) {
        Iterator extends Person> it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
    

    좋은 웹페이지 즐겨찾기