2012-10-20 3 views
0

자바 코드를 컴파일 할 때 올바르게 컴파일 할 수 없지만 프로그램을 실행할 때 정확하게 컴파일 할 수는 없습니다
스레드 "main" java.lang.ClassCastException : java.lang.StringBuffer를 java.lang.Comparable에 캐스트 할 수 없습니다.
java.lang.ClassCastException Java 콜렉션 인터페이스 인 java 코드를 실행할 때 발생했습니다

그래서 두 개의 질문이 있습니다

  1. SortedSet의 또는 의 SortedMap에 추가 요소가해야해야 정렬을?이 규칙은 java 컬렉션 프레임 워크의 다른 인터페이스에서도 작동합니까?
  2. 왜 프로그램을 올바르게 컴파일 할 수 있었지만 실행할 수 없었습니까? 프로그램이 실행되는 동안 어떤 일이 발생했는지

    import java.util. *;

    public class SortMe { 
        public static void main(String args[]) { 
         SortedSet<StringBuffer> s = new TreeSet<StringBuffer>(); 
         s.add(new StringBuffer("Red")); 
         s.add(new StringBuffer("White")); 
         s.add(new StringBuffer("Blue")); 
         System.out.println(s.first()); 
        } 
    

    }

답변

3

SortedSet가 삽입 된 요소를 정렬하는 데 사용으로 만 제네릭 선언 Comparable 유형을. 이제 StringBuffer부터 Comparable을 구현하지 않으므로 예외가 발생합니다. 는 Comparable 인터페이스를 구현해야합니다 (또는 지정된 Comparator에 의해 받아 들여질) 소트 세트에 삽입

모든 요소 - 다음 documentation에서

SortedSet<T> --> `T` must implement `Comparable` 

. 게다가, 요소는 모두 서로 비교 가능해야합니다. e1.compareTo (e2) (또는 comparator.compare (e1, e2))는 에 대해 ClassCastException을 던져서는 안됩니다. 정렬 된 집합의 모든 요소 e1과 e2. 이 제한을 위반하면 잘못된 메소드 또는 생성자 호출 이 ClassCastException을 발생시킵니다.

하지만 질문은 왜 SortedSet<String> 대신 SortedSet<StringBuffer>을 만드나요?

관련 문제