범용(二) - 유형 매개 변수 와일드카드

2629 단어 와일드카드
만약 우리가 리스트의 요소를 표시하기 위해 방법을 써야 한다고 가정하자.이전에 우리는 이렇게 코드를 쓰기만 했다.
public static void printList(PrintWriter out, List list) {
    for(int i=0, n=list.size(); i < n; i++) {
        if (i > 0) out.print(", ");
        out.print(list.get(i).toString());
    }
}

 
자바에서0 에서 List는 일반적인 형식입니다. 이 방법을 컴파일하려고 하면 unchecked 경고를 받을 수 있습니다.이러한 경고를 해결하기 위해 우리는 이렇게 이 방법을 수정한다.
public static void printList(PrintWriter out, List<Object> list) {
    for(int i=0, n=list.size(); i < n; i++) {
        if (i > 0) out.print(", ");
        out.print(list.get(i).toString());
    }
}

이 코드는 경고 없이 컴파일될 수 있지만, List < Object > 로 명시된list만 이 방법을 사용할 수 있기 때문에, 매우 유효하지는 않습니다.List과List와 같은 List는 List로 전환될 수 없습니다.사실 우리는 우리가 전송한 모든 리스트를 받아들일 수 있는 안전한 유형의 printList () 방법이 필요하다. 왜 매개 변수화되었는지는 상관하지 않는다.해결 방법은 유형 매개 변수 와일드카드를 사용하는 것이다.방법은 다음과 같이 수정할 수 있습니다.
public static void printList(PrintWriter out, List<?> list) {
    for(int i=0, n=list.size(); i < n; i++) {
        if (i > 0) out.print(", ");
        Object o = list.get(i);
        out.print(o.toString());
    }
}

이 버전의 방법은 경고 없이 컴파일될 수 있으며, 우리가 원하는 곳에서도 사용할 수 있다.와일드카드 "?"알 수 없는 유형, 유형 List"List of unknown"
일반적인 원칙으로 만약에 유형이 범형이고 우리가 값을 모르거나 무관심한 유형이라면'?'를 사용해야 한다.처리되지 않은 유형을 대체하기 위해 와일드카드를 사용합니다.처리되지 않은 형식은 아래로 호환되기 위해서만 허용되고, 오래된 코드에만 허용되어야 한다.어쨌든 구조기를 호출할 때 어댑터를 사용할 수 없음을 주의하십시오.다음 코드는 올바르지 않습니다.
List<?> l = new ArrayList<?>();

유형을 알 수 없는 리스트를 만드는 것은 무리다.만약 그것을 만들었다면, 우리는 그것이 유지할 원소가 어떤 유형인지 알아야 한다.다음 방법에서 원소 형식에 신경 쓰지 않고 이 리스트를 훑어볼 수 있지만, 그것을 만들 때 원소의 유형을 설명해야 합니다.어떤 유형이든 유지할 수 있는 List가 필요한 경우에는 다음과 같이 써야 합니다.
List<Object> l = new ArrayList<Object>();

위의 printList () 예에서 ListList도 아니고 처리되지 않은 List도 아닙니다.와일드카드를 사용하는 List두 가지 중요한 특성이 있다.첫째, get () 과 유사한 방법을 살펴보면, 이 값의 유형은 형식 매개 변수에서 지정한 값으로 되돌아온다는 성명이 있습니다.이 예에서 형식은'unknown'이기 때문에 이 방법들은 Object로 되돌아옵니다.우리가 바라는 것이 이 Object의 toString () 방법을 호출하는 것이기 때문에 프로그램은 우리의 의사를 잘 만족시킬 수 있다.둘째, List의 유사한dd() 방법을 살펴보면 그들은 하나의 매개 변수를 받아들이는 것으로 성명되고 이 매개 변수는 유형 매개 변수에 의해 정의된다.의외로, 형식 파라미터가 확실하지 않으면, 컴파일러는 파라미터 형식이 확실하지 않은 방법을 사용할 수 없습니다. 왜냐하면 적절한 값이 들어왔는지 확인할 수 없기 때문입니다.하나의 List(?)실제로는 읽기 전용입니다. 컴파일러는dd (), set (),ddAll () 같은 방법을 호출할 수 없습니다.

좋은 웹페이지 즐겨찾기