자바 범용 학습 - 유형 어댑터

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(); 

좋은 웹페이지 즐겨찾기