当我运行与Java集合接口有关的java代码时,发生了java.lang.ClassCastException

时间:2012-10-20 09:28:18

标签: java exception collections jquery-ui-sortable

当我编译java代码时,它无法正确编译。但是当我运行程序时,
在线程“main”中的异常java.lang.ClassCastException:java.lang.StringBuffer不能强制转换为java.lang.Comparable。

所以我有两个问题:

  1. 添加到 SortedSet SortedMap 的元素是否必须可排序?此规则是否也可用于其中的任何其他界面java collections framwork
  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());
        }
    

    }

1 个答案:

答案 0 :(得分:3)

SortedSet只在其通用声明中使用Comparable类型,因为它们使用它来对插入的元素进行排序。现在StringBuffer没有实现Comparable,所以你得到了那个例外。

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

来自documentation: -

  

插入到有序集中的所有元素都必须实现Comparable   接口(或被指定的比较器接受)。此外,   所有这些要素必须相互比较:e1.compareTo(e2)(或   comparator.compare(e1,e2))不得抛出ClassCastException   排序集中的任何元素e1和e2。试图违反这一点   限制将导致违规方法或构造函数调用   抛出ClassCastException。

但问题是,为什么要制作SortedSet<StringBuffer>而不是SortedSet<String>