Java의 일반적인 특성을 초보적으로 이해하다

5380 단어 Java범용
Java SE1.5에서 범용 (일본어의 총칭형) 이라는 새로운 기능이 추가되었습니다.무엇이 범형이라고 하는가?통속적으로 말하면 일반적인 방식처럼 특정한 유형을 사용하여 지정하는 것이 아니라 일반적인 지정 대상이 조작하는 유형이다.범형의 본질은 조작된 데이터 형식을 매개 변수화하는 것이다. 즉, 이 데이터 형식은 하나의 매개 변수로 지정된다.이런 매개 변수 유형은 클래스, 인터페이스, 방법 정의에 사용할 수 있다.
 
1. 왜 범형을 사용합니까?
이전의 J2SE에서는 일반적인 형식이 없는 상황에서 Object 형식을 사용하여 다양한 유형의 데이터를 조작했다.이때 가장 많이 조작된 것은 이 Object에 대한 데이터의 강제 변환이다. 이런 변환은 개발자가 이 데이터 유형에 대해 명확한 상황에서 진행된 것이다. (예를 들어 Object형을 String형으로 바꾸는 것).만약 형식이 일치하지 않는다면, 컴파일러는 컴파일하는 과정에서 오류를 보고하지 않지만, 실행할 때 오류가 발생할 수 있습니다.
범용형을 사용하는 장점은 컴파일할 때 유형 안전 검사를 하고 실행할 때 모든 전환이 강제적이고 은밀하며 코드의 중용률을 크게 높인다는 데 있다.
 
2. 정의 & 사용
유형 매개변수의 명명 스타일은 다음과 같습니다.
형식 형식 매개 변수의 이름으로 간결한 이름을 추천합니다. (가능하면 단일 문자)가장 좋은 것은 소문자를 피하는 것이다. 이것은 그것으로 하여금 다른 일반과
형식 매개 변수는 쉽게 구분된다.
T를 사용하는 것은 유형을 대표하며, 언제든지 이보다 구체적인 유형으로 구분할 수 없다.이것은 흔히 범용 방법에 나타난다.만약 여러 종류의 매개 변수가 있다면, 우리는
알파벳 테이블의 T와 가까운 알파벳, 예를 들어 S를 사용할 수 있습니다.
만약 하나의 범용 함수가 하나의 범용 클래스에 나타난다면, 방법의 유형 매개 변수와 클래스의 유형 매개 변수에서 같은 이름을 사용하여 혼합을 피하는 것이 가장 좋다
헛갈리다내부류에도 마찬가지다.
 
1. 유형 매개변수가 있는 클래스 정의
유형 매개 변수가 있는 클래스를 정의할 때 클래스 이름 뒤에 있는 <>에서 하나 이상의 유형 매개 변수의 이름을 지정하고 유형 매개 변수의 이름을 지정할 수 있습니다
값 범위가 한정되고 여러 종류의 매개 변수가 사용되며 번호가 구분됩니다.
유형 매개 변수를 정의한 후 위치를 정의한 후의 클래스의 거의 모든 곳(정적 블록, 정적 속성, 정적 방법 제외)에서 유형 매개 변수를 사용할 수 있습니다.
그냥 쓰는 스타일처럼.
부모 클래스가 정의한 유형 매개 변수는 이불 클래스를 계승할 수 없습니다.

 public class TestClassDefine<T, S extends T> {
   .... 
 }
 
2. 대기 유형 매개변수 방법 정의
유형 매개 변수를 포함하는 방법을 정의할 때, 보이는 범위 수식(예:public) 뒤에 있는 <>에서 하나 이상의 유형 매개 변수의 이름을 지정합니다.
또한 유형 파라미터의 수치 범위를 한정하여 여러 유형 파라미터 간에 사용하고 번호를 구분할 수 있다.
유형 파라미터를 정의한 후, 위치를 정의한 후의 방법의 임의의 곳에서 유형 파라미터를 사용할 수 있으며, 마치 일반적인 유형을 사용하는 것과 같다.
예:

 public <T, S extends T> T testGenericMethodDefine(T t, S s){
   ...
 }
주의: 띠 유형 파라미터를 정의하는 방법은 여러 파라미터와 되돌아오는 값 간의 관계를 표현하기 위한 것이다.예를 들어 이 예에서 T와 S의 계승
승관계, 반환 값의 유형은 첫 번째 유형 매개 변수의 값과 같습니다.
만약 단지 다중 상태를 실현하고 싶다면, 우선 어댑터를 사용하여 해결하십시오.와일드카드의 내용은 다음 장을 참조하십시오.

 public <T> void testGenericMethodDefine2(List<T> s){
   ...
 }
고쳐야 한다

 public void testGenericMethodDefine2(List<?> s){
   ...
 }
 
3. 유형 매개 변수 부여
클래스나 방법의 유형 매개 변수에 값을 부여할 때 모든 유형 매개 변수에 값을 부여해야 합니다.그렇지 않으면 컴파일 오류가 발생합니다.
 
4. 유형 매개 변수가 있는 클래스에 유형 매개 변수 값 부여
유형 파라미터가 있는 클래스에 유형 파라미터를 부여하는 데는 두 가지 방식이 있다
첫 번째 성명류 변수나 실례화 시.예:

 List<String> list;
 list = new ArrayList<String>;
두 번째 계승 클래스나 인터페이스를 실현할 때.예:

 public class MyList<E> extends ArrayList<E> implements List<E> {...} 
 
5. 테이프 유형 매개 변수 방법에 값을 부여한다
모범 방법을 호출할 때, 컴파일러는 자동으로 유형 매개 변수에 값을 부여합니다. 값을 부여할 수 없을 때 시간 컴파일이 잘못되었습니다.예:

 public <T> T testGenericMethodDefine3(T t, List<T> list){
   ...
 }
 public <T> T testGenericMethodDefine4(List<T> list1, List<T> list2){
   ...
 }
 
 Number n = null;
 Integer i = null;
 Object o = null;
 testGenericMethodDefine(n, i);// T Number, S Integer
 testGenericMethodDefine(o, i);//T Object, S Integer
 
 List<Number> list1 = null;
 testGenericMethodDefine3(i, list1)// T Number
 
 List<Integer> list2 = null;
 testGenericMethodDefine4(list1, list2)// 
 
6. 와일드카드
위의 두 소절에서 유형 매개 변수에 구체적인 값을 부여하고, 이외에 유형 매개 변수에 불확실한 값을 부여할 수 있다.예:

 List<?> unknownList;
 List<? extends Number> unknownNumberList;
 List<? super Integer> unknownBaseLineIntgerList; 
참고: Java 컬렉션 프레임에서 매개변수 값이 알 수 없는 유형의 컨테이너 클래스인 경우 요소만 읽을 수 있고 요소를 추가할 수 없습니다.
그 유형은 알 수 없기 때문에 컴파일러는 추가 요소의 유형과 용기의 유형이 호환되는지 식별할 수 없습니다. 유일한 예외는 NULL

 List<String> listString;
 List<?> unknownList2 = listString;
 unknownList = unknownList2;
 listString = unknownList;// 
 
7. 수조 모델
범주 매개 변수 값을 가진 클래스 성명 그룹을 사용할 수 있지만, 생성된 그룹은 사용할 수 없습니다

 List<Integer>[] iListArray;
 new ArrayList<Integer>[10];// 
 
3. 확장
1. extends 문장
extends 문장을 사용하면 범용 매개 변수의 적용 범위를 제한합니다.예:
은 이 범용 매개 변수의 사용 범위가collection 인터페이스를 실현한calss임을 나타낸다.을 가져오면 프로그램 컴파일이 잘못되었습니다.
2. 슈퍼 문장
슈퍼 문장의 작용은 extends와 마찬가지로 범용 매개 변수의 적용 범위를 제한한다.차이점은 슈퍼는 제한된 범용 매개 변수로 이 클래스의 상위 부류만 지정할 수 있다는 것이다.
예를 들어 는 이 범용 매개 변수가 List와 List의 상위 부류만 사용할 수 있음을 나타냅니다.
3. 와일드카드
어댑터를 사용하는 목적은 범용 매개 변수가 제한되어 동적으로 실례에 따라 확정할 수 없는 단점을 해결하기 위해서이다.
예: public class SampleClass < T extends S> {...}
만약 A, B, C, Z 26개의class가 모두 S 인터페이스를 실현했다면.우리가 사용할 때 이 26개의class 형식의 범용 매개 변수를 사용해야 합니다.그럼 실례화할 때 어떡하지?차례대로 쓰다

SampleClass<A> a = new SampleClass();
SampleClass<B> a = new SampleClass();
…
SampleClass<Z> a = new SampleClass();
이것은 분명히 쓸데없는 것이니 차라리 Object를 사용하고 범용을 사용하지 않는 것이 낫다. 허허, 그렇지?
조급해하지 마라, 우리 어댑터를 사용하면 OK가 된다.

SampleClass<? Extends S> sc = new SampleClass();
 
sc 변수 하나만 설명하면 편리합니다!

좋은 웹페이지 즐겨찾기