자바 범용 학습 - 유형 어댑터
2815 단어 자바 범 형
void printList(List l) {
for (Object o : l)
System.out.println(o);
}
위의 코드 는 JDK 5.0 에서 컴 파일 되 었 으 나 List < Integer > 로 호출 하려 고 하면 경 고 를 받 을 수 있 습 니 다.경고 가 나타 난 것 은 일반적인 (List < Integer >) 을 List (원본 형식) 로 만 약속 하 는 방법 에 전달 하기 때 문 입 니 다. 이것 은 일반적인 형식 을 사용 하 는 안전 을 파괴 하기 때 문 입 니 다.
아래 와 같은 방법 을 만 들 려 고 한다 면 어떻게 될 까?
void printList(List<Object> l) {
for (Object o : l)
System.out.println(o);
}
이것 은 여전히 컴 파일 을 통과 하지 않 습 니 다. 왜냐하면 하나의 List < Integer > 는 List < Object > 가 아니 기 때 문 입 니 다.이것 이 야 말로 정말 귀 찮 습 니 다. 현재 당신 의 일반적인 비 일반적인 버 전 은 아직 유용 하지 않 습 니 다!
솔 루 션 은 형식 마스크 를 사용 합 니 다:
void printList(List<?> l) {
for (Object o : l)
System.out.println(o);
}
위의 코드 중의 물음 표 는 하나 이다.
형식 어댑터.그것 은 물음표 로 읽는다.
List모든 범용 List 의 부모 형식 이기 때문에 List < Object >, List < Integer > 또는 List < List < List < Flutzpah >> > 를 printList () 에 전달 할 수 있 습 니 다.
형식 마스크 를 도 입 했 습 니 다. List 를 설명 할 수 있 습 니 다.형식의 변수.당신 은 이런 List 에 대해 무엇 을 할 수 있 습 니까?매우 편리 합 니 다. 그 중에서 요 소 를 검색 할 수 있 지만 요 소 를 추가 할 수 없습니다 (null 을 추가 할 수 있 습 니 다).이 유 는 컴 파일 러 가 목록 을 수정 하 는 방법 을 알 고 있 는 것 이 아니 라 (대부분) 변화 하 는 방법 이 변화 하지 않 는 방법 보다 더 많은 유형 정 보 를 필요 로 하기 때 문 입 니 다.다음 코드 는 잘 작 동 합 니 다.
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(42));
List<?> lu = li;
System.out.println(lu.get(0));
왜 이 코드 는 일 을 할 수 있 습 니까?lu 에 대해 컴 파일 러 는 List 의 유형 매개 변수 값 을 전혀 모른다.그러나 컴 파일 러 는 비교적 똑똑 해서 유형 적 추 리 를 할 수 있다.이 예 에서 알 수 없 는 형식 매개 변 수 는 Object 를 확장 해 야 한다 고 추정 합 니 다.(이 특정한 추 리 는 큰 도약 이 없 지만, 컴 파 일 러 는 매우 탄복 할 만 한 유형의 추 리 를 할 수 있 습 니 다. 나중에 볼 수 있 습 니 다. (밑 에 있 는 디 테 일 한 부분 에서) 그래서 List. get () 을 호출 하고, 반환 유형 을 Object 로 추정 합 니 다.
다른 한편, 아래 코드 는 작 동 할 수 없습니다.
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(42));
List<?> lu = li;
lu.add(new Integer(43)); // error
이 예 에서 lu 에 대해 컴 파 일 러 는 List 의 유형 매개 변수 에 대해 충분 한 엄밀 한 추 리 를 할 수 없습니다. Integer 를 List. add () 에 전달 하 는 것 이 유형 이 안전 하 다 는 것 을 확인 하기 때문에 컴 파 일 러 는 이렇게 할 수 없습니다.
컴 파일 러 가 목록 의 내용 을 변경 하지 않 는 방법 을 알 고 있다 고 생각 하지 않도록 아래 코드 가 작 동 할 수 있 습 니 다. 컴 파일 러 에 의존 하지 않 기 때문에 lu 의 유형 매개 변수 에 대한 모든 정 보 를 알 아야 합 니 다.
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(42));
List<?> lu = li;
lu.clear();
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android 범용 사용범 형 은 본질 적 으로 매개 변수 유형 화 이다. 범 형 은 도대체 무슨 소 용이 있 습 니까? ① 컴 파일 할 때 더 강 한 유형 검 사 를 실시 합 니 다(더 많은 오류 가 감지 되 어 코드 의 안정성 을 향상...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.