2013-10-21 1 views
0

리스트의 최대 값을 반환하는 메소드를 만들 것이라고 가정합니다. 일반적인 방법이라고 생각합니다. 그러나 나는 매개 변수를 이해하지 못한다. 또한 필자는 솔루션을 통해 목록을 실행하는 iterator를 만들었지 만 iterator의 인스턴스를 만들 때이 메서드는 다음 오류를 제공합니다. "#nameofclass를 정적 컨텍스트에서 참조 할 수 없습니다."그런 다음 여기에 인스턴스를 만들려면 어떻게해야합니까? (어떤 이유로 정적 인 가정) 나는 어떤 도움을 주셔서 감사하겠습니다!이해 : public static <T> int max (리스트 c)

public static <T> int maks(List<T> list, Comparator<? super T> c) 
    { 
    // return max in a list 
    } 
+0

당신이 이해하지 못했던 그 선언의 부분은 무엇입니까? –

+0

''반환 유형'int'가 유형 매개 변수 선언 앞에옵니다. 이러한 키워드를 사용하여 조사하십시오. –

+0

나는 매개 변수를 이해하지 못한다. 우선 제네릭리스트가 좋다. – comodeque

답변

2

다음은 꽤 일반적인 제네릭 메서드 선언이다. 이 두 관용구에 익숙해지면 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는 항상 인스턴스의 소비자이므로 매개 변수 목록에 지정하는 올바른 방법은 메서드 선언에 표시된 것과 같습니다.

0

당신은 목록 목록 및 비교기 C가, 왜 그냥 :

Collections.max(list, c); 

- 그것은 목록 또는 다른 컬렉션에서 최대 요소를 반환합니다.

일반 목록에서 최대 값을 찾을 때 int를 반환하려는 이유가 무엇인지 이해하지 못 하겠지만 - 색인을 찾고 있습니까? 1) 제네릭 클래스/인터페이스, 2) 일반적인 방법이 전체 일반 선언의 종류가 있습니다

public static <T> int max(List<T> list, Comparator<? super T> c) { 
    : 
    : 
} 

:

관련 문제