当我编译java代码时,它无法正确编译。但是当我运行程序时,
在线程“main”中的异常java.lang.ClassCastException:java.lang.StringBuffer不能强制转换为java.lang.Comparable。
所以我有两个问题:
为什么程序可以正确编译。但是无法运行?程序运行时发生了什么
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());
}
}
答案 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>
?