다음은 꽤 일반적인 제네릭 메서드 선언이다. 이 두 관용구에 익숙해지면 generics를 잘 이해할 수 있습니다. 이것에 대한 원시 형식 선언은 다음과 같습니다.
public static int max(List list, Comparator c) {
:
:
}
원시 형식 선언을 사용하면이 메서드가 int 형식의 호출자에게 값을 반환하는지 쉽게 알 수 있습니다. 이 메서드는 List 인스턴스와 Comparator 인스턴스의 두 매개 변수를 사용합니다.
원시 형식 선언의 문제는 안전하지 않다는 것입니다. 왜? List<E>
및 Comparator<T>
은 공식적인 제네릭 형식 매개 변수로 정의 된 일반 클래스입니다. 제네릭 클래스를 사용하지만 매개 변수를 지정하지 않으면 (위의 선언과 같이) 제네릭이 제공하는 모든 유형 안전성과 표현력을 잃게됩니다.
일반적인 방법은 다음과 같은 방법으로 특징 : 일반적인 방법은 메서드 선언에서 해당 유형의 매개 변수와 형식 매개 변수는 반환 형식 직전에 올 것을 선언
public <T> MyType myMethodName(/* parameters */) { ... }
공지있다. 이것은 표준입니다.
이 경우 <T>
은 메서드에 대한 제한되지 않은 형식 매개 변수를 나타냅니다. 메서드에 T가 나타날 때마다 메서드에 전달 된 실제 형식 매개 변수는 T 위치를 대신 사용합니다. 메서드 매개 변수를 T에 종속되게 만드는 것은 일반적이지만 필수는 아니지만 (T는 메서드 본문의 어느 위치 에나 나타날 수 있습니다. 타입 선언이 나타날 수 있습니다 - 타입 소거에 의해 예외가 필요함). 당신의 예에서
는 매개 변수 목록은
(List<T> list, Comparator<? super T> c)
... 당신의 메서드에 전달 인스턴스 list
이 유형의 목록있을 것이라는 점을 지정된 첫 번째 매개 변수입니다. T는 메서드 선언에 나열된 제네릭 메서드 형식 매개 변수이기 때문에 메서드에 전달 된 실제 형식 매개 변수 대신 사용할 수 있습니다.List<String> list.
두 번째 매개 변수는 조금 더 복잡합니다. 이것은 제한된 와일드 카드 유형 매개 변수입니다. ?
의 sematics는 "모든 유형"이고 super
의 의미는 "같은 클래스 또는 수퍼 클래스 인 모든 클래스"입니다. 따라서 두 번째 매개 변수는 "메서드에 전달 된 실제 형식 매개 변수 T의 동일한 형식 또는 수퍼 형식 인 모든 형식"으로 읽습니다.
제한된 와일드 카드 유형에 적합한 니모닉이 있습니다 (PECS). 생산자가 확장, 소비자 슈퍼. Comparator는 항상 인스턴스의 소비자이므로 매개 변수 목록에 지정하는 올바른 방법은 메서드 선언에 표시된 것과 같습니다.
당신이 이해하지 못했던 그 선언의 부분은 무엇입니까? –
''반환 유형'int'가 유형 매개 변수 선언 앞에옵니다. 이러한 키워드를 사용하여 조사하십시오. –
나는 매개 변수를 이해하지 못한다. 우선 제네릭리스트가 좋다. – comodeque