0

Javaコードをコンパイルすると、正しくコンパイルできません.しかし、プログラムを実行すると
、スレッド「メイン」の例外java.lang.ClassCastException:java.lang.StringBufferをjava.lang.Comparableにキャストできません。

だから私は2つの質問があります:

  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());
        }
    

    }

4

1 に答える 1

3

SortedSetComparable挿入された要素をソートするために使用するため、ジェネリック宣言でのみ型を取ります。StringBuffer実装しないComparableので、その例外が発生します。

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

からdocumentation: -

ソート済みセットに挿入されるすべての要素は、 Comparable インターフェースを実装する (または指定されたコンパレーターによって受け入れられる) 必要があります。さらに、そのような要素はすべて相互に比較可能である必要があります。e1.compareTo(e2) (またはコンパレーター.compare(e1, e2)) は、並べ替えられたセット内の要素 e1 および e2 に対して ClassCastException をスローしてはなりません。この制限に違反しようとすると、問題のあるメソッドまたはコンストラクターの呼び出しで ClassCastException がスローされます。

しかし、問題は、なぜSortedSet<StringBuffer>代わりに作っているのSortedSet<String>ですか?

于 2012-10-20T09:29:42.297 に答える