Java의 일반적인 특성을 초보적으로 이해하다
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 문장을 사용하면 범용 매개 변수의 적용 범위를 제한합니다.예:
2. 슈퍼 문장
슈퍼 문장의 작용은 extends와 마찬가지로 범용 매개 변수의 적용 범위를 제한한다.차이점은 슈퍼는 제한된 범용 매개 변수로 이 클래스의 상위 부류만 지정할 수 있다는 것이다.
예를 들어
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 변수 하나만 설명하면 편리합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.