2017-12-29 30 views
0

내 코드를 실행하는 데 꽤 어려움이 있습니다. 나는 주어진리스트에서 모든 중복을 정렬하고 제거해야하는 일반 메소드를 가지고있다. 목록의 항목 (예 : String)은 모두 Comparable 인터페이스를 구현합니다. 불행히도, 이것은 내가 지금까지 가지고 무엇Java Generics 유형 인수

public static <T> List<T> distinctAndSort(List<T> s) { 
    List<T> list = s.stream().distinct().collect(Collectors.toList()); 
    Collections.sort(list); //Error 
    return list; 
} 

... 코드는 컴파일되지 않고, 그 이유를 이해하지 않습니다. List<T>을 정렬 할 수없는 이유는 무엇입니까? 유형 컬렉션 (방법의 종류 (List<T extends Comparable<? super T>>)는 인수 (List<T>)에 적용 할 수 없습니다.

제 기능을 작동하게하기 위해, 내가 놓친 거지 뭐? 모든 도움

답변

10

에 대한 들으이 형태 변수를 선언 로 :

<T extends Comparable<? super T>> 

이는 Comparable를 구현하는 형식으로 호출 될 당신의 방법을 제한, 따라서 당신이 명시 적으로 Comparator없이 Collections.sort를 호출 할 수 있습니다

,745.

또는 Comparator<? super T>을 메서드의 추가 매개 변수로 제공하고 Collections.sort으로 전달할 수 있습니다.

또한, 당신은 스트림 API로 정렬을 할 수 있습니다 :

return s.stream() 
    .distinct() 
    .sorted() 
    .collect(Collectors.toList()); 
1

이 문서에 따르면, Collections.sort(List<T>)Comparable의 목록이어야합니다, 또는 당신은 Comparator<T>를 제공해야합니다. 당신은 당신의 서명을 변경할 수 있습니다

public static <T extends Comparable<? super T>> List<T> distinctAndSort(List<T> s) 

https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List) https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator)

+0

감사하는 샤름처럼 일! :) – whiterose