Java 일반 정의 및 사용 인스턴스 상세 정보

8125 단어
본고의 실례는 자바의 범용 정의와 용법을 설명했다.여러분에게 참고하도록 공유하겠습니다. 구체적으로는 다음과 같습니다.

1. 범형의 유래


먼저 다음 코드를 살펴보십시오.

import java.util.List;
import java.util.ArrayList;
public class TestGeneric {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(1);
        list.add("1");
        list.add(new Object());
        System.out.println(list);
        //   
        Integer var1 = (Integer) list.get(0);
        String var2 = (String) list.get(1);
        Object var3 = list.get(2);
        System.out.println(var1 + " " + var2 + " " + var3);
    }
}


실행 결과:
[1, 1, java.lang.Object@1db9742] 1 1 java.lang.Object@1db9742
이 코드는 매우 간단합니다. 성형, 문자열, 대상을list 집합에 넣고 하나씩 꺼내십시오.이를 통해 알 수 있듯이 List 인터페이스는 정의할 때 요소의 유형을 알지 못하기 때문에 기본값은 Object입니다. 즉, 임의의 유형의 요소가list 집합에 들어가면 자동으로 포장됩니다.값을 얻는 과정은 더욱 복잡하다. 모든 얻은 값은 포장된 Object 대상이고 모든 원소의 초기 유형을 알아야 상자를 뜯을 수 있다.일반적으로 집합을 사용할 때 집합된 원소는 왕왕 공통된 특징을 가진다. 예를 들어 같은 종류에 속한다. 만약에 처음에list 집합 원소의 유형을 한정했다면 상술한 규범화되지 않은 조작을 피할 수 있다.코드는 다음과 같습니다.

import java.util.List;
import java.util.ArrayList;
public class TestGeneric {
    @SuppressWarnings("unused")
    public static void main(String[] args) {
        List list = new ArrayList();
        // list.add(1);//  
        // list.add(new Object());//  
        list.add("1");
        //   
        String var1 = list.get(0);//     
    }
}


이렇게 되자 범형 집합이라는 말이 생겼다.실제로 List 인터페이스의 Api를 살펴보면 List 인터페이스가 바로 일반 인터페이스로 유형 매개 변수 E를 받아들일 수 있으며 매개 변수를 전달하지 않으면 기본적으로 Object 형식입니다.

2. 범용 유형의 계승 관계


컬렉션의 요소를 인쇄할 수 있는 코드는 다음과 같습니다.

import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
public class TestGeneric{
    //        
    public void print(Collection c){
     System.out.println(c);
    }
    public static void main(String[] args){
     List list=new ArrayList();
     new TestGeneric().print(list);
 }
}


출력:
TestGeneric.java:11:TestGeneric의 print(java.util.Collection)를 (java.util.List) new TestGeneric()에 적용할 수 없습니다.print(list); ^1 오류
전달된 매개 변수의 유형이 일치하지 않는다는 것은 분명하다.String은 Object에서 물려받은 거 아닌가요?맞아요. String은 Object에서 계승된 것이지만 ListList , 。 , ?

2.1 유형 와일드카드


import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
public class TestGeneric {
    //         
    public void print(Collection> c) {
        System.out.println(c);
    }
    public static void main(String[] args) {
        List list = new ArrayList();
        new TestGeneric().print(list);
    }
}


, ? , Object ,List> List 。

2.2 일반 방법

, :


import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
public class TestGeneric {
    //         
    public  void print(Collection c) {
        System.out.println(c);
    }
    public static void main(String[] args) {
        List list = new ArrayList();
        new TestGeneric().print(list);
    }
}


( )

, T,E 。 , ?

2.3 일반 방법과 어댑터의 차이


import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
public class TestGeneric {
    //         
    public  void print(Collection c1, Collection c2) {
        System.out.println(c1);
        System.out.println(c2);
    }
    public static void main(String[] args) {
        List list1 = new ArrayList();
        List list2 = new ArrayList();
        new TestGeneric().print(list1, list2);//  2 father  
        List list3 = new ArrayList();
        List list4 = new ArrayList();
        new TestGeneric().print(list3, list4);// T child,E father
        List list5 = new ArrayList();
        List list6 = new ArrayList();
        new TestGeneric().print(list5, list6);// T father,E child,  
    }
}
class Father {
}
class Child extends Father {
}
class Other {
}


T,E :T E , ,T E , E , E exends T , 。 ? , 。

, ? , 。 , , ? 。

2.4 일반 매개 변수 상하의 주의


import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
public class TestGeneric {
    //                   
    public  T copy(Collection des, Collection extends T> src) {
        T lastElement = null;
        for (T t : src) {
            lastElement = t;
            des.add(t);
        }
        return lastElement;
    }
    public static void main(String[] args) {
        List des = new ArrayList();
        List src = new ArrayList();
        src.add(new Integer(1));
        Integer lastElement = new TestGeneric().copy(des, src);//
        System.out.println(lastElement.getClass());
    }
}


TestGeneric.java:18:
: java.lang.Number
: java.lang.Integer
Integer lastElement= new TestGeneric().copy(des,src);//
                                              ^
1

copy , T Number,? Integer。 T Number , Integer。 , ,

1:


Number lastElement=new TestGeneric().copy(des,src);


,? T , T=lastElement라는 문장은 다태적으로 표현됐어요. T타입으로 되돌아왔지만 다태적인 표현은?유형, 즉 Interger 유형, 호출lastElement.getClass()도 자바가 되돌아오는 것을 발견할 수 있습니다.lang.Integer 유형, 컴파일 유형은 T 유형이고 실제 실행 유형은?유형이렇게 하면 된다. 예를 들면 하다태 변환,


Father f=new Child();
Child c=f;//      ,     


f의 다태적 표현은 하위 차일드이지만 위의 한 구절은 문법 검사도 통과하지 못한다.이것이 바로 위의 Integer가 Number를 호환하지 못하는 이유입니다.
방법2:
... 로 바꾸다

public  T copy(Collection super T> des,Collection src)

이렇게 되면,?유형이 부모 클래스로 변하고 T 유형이 하위 클래스로 변하기 때문에 방법에서 되돌아오는 T 유형의 대상, 즉 lastElement은 다중성을 가지지 않는다.범형 중의 상하한선은 매우 학식이 있는 것으로 매번 원본 코드를 볼 때마다 오랫동안 궁리하지만 여전히 광범위한 인터페이스+범형의 디자인에서 혼미해진다. 이런 디자인은 정말 대상을 향한 특성을 돋보이게 하기 위해서이다. 앞으로 천천히 생각해 보자.
여기서도 다시 볼 수 있다?어댑터는 의존 관계를 가진 일반적인 방법을 처리하는 데 지나치게 유연해 보이기 때문에 잠재적인 위험을 초래할 수 있다.
더 많은 자바 알고리즘과 관련된 내용에 관심이 있는 독자들은 본 사이트의 주제를 볼 수 있다.,,,,,
본고에서 서술한 바가 모두의 자바 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기