Java 为什么在使用Collections.sort()但不使用TreeSet.add(new Object())时会出现编译时错误

Java 为什么在使用Collections.sort()但不使用TreeSet.add(new Object())时会出现编译时错误,java,Java,为什么我可以这样做: TreeSet<Object> treeSet = new TreeSet<Object>(); treeSet.add(new Object()); TreeSet TreeSet=new TreeSet(); 添加(新对象()); 但不是这个: final List<Object> objects = new ArrayList<Object>(); Collections.sort(objects); final

为什么我可以这样做:

TreeSet<Object> treeSet = new TreeSet<Object>();
treeSet.add(new Object());
TreeSet TreeSet=new TreeSet();
添加(新对象());
但不是这个:

final List<Object> objects = new ArrayList<Object>();
Collections.sort(objects);
final List objects=new ArrayList();
集合。排序(对象);
第一个给我一个ClassCastException,但第二个给我一个编译错误。据我所知,这两种情况下的实际问题是相同的:
java.lang.Object
没有实现Comparable接口

更新: 嗯,出于某种原因,这只适用于Java7,而不适用于Java6。 我是愚蠢还是疲倦?有人能解释一下吗

更新#2: 根据java版本的不同,我会得到不同的结果。请看图片:
起初我皱着眉头,但你是对的


SortedSet
界面不强制您将其泛型类型指定为
可比
树集
还允许您为不可比的类型指定
比较器
。编译器无法区分这两个选项。

集合。排序
需要可比较的列表<代码>树集在键入时没有该限制。对于默认构造函数,文档称它按照“元素的自然顺序”进行排序。不清楚的是它将如何排序
对象
,但您的问题在于键入

更新: 我错过了问题的最后一部分。如果不看stacktrace,我会猜测,由于
TreeSet
的默认构造函数尝试按“自然顺序”排序,因此在内部,它正在对
Comparable
进行转换,这将导致
ClassCastException

更新: 我仔细查看了
TreeSet
(,)的javadocs,它说

构造一个新的空树集,根据自然属性进行排序 元素的排序。插入到集合中的所有元素都必须 实现可比较的接口。此外,所有这些因素 必须相互可比:e1.compareTo(e2)不能抛出 集合中任何元素e1和e2的ClassCastException。如果用户 尝试向集合中添加违反此约束的元素 (例如,用户尝试将字符串元素添加到 元素是整数),add调用将抛出ClassCastException

两者都有。因此,如果JDK6没有发生ClassCastException,那可能是一个bug。

因为
TreeSet
不限于实现
Comparable
的对象,因为您可以通过
比较器构建它

Collections.sort(T)
需要
T
实现
compariable
Collections
中还有另一个方法可以接受任何对象,但您需要提供一个
比较器


最后,这完全取决于您的对象是否具有自然排序,因为它们实现了
Comparable
,或者您为对象提供了必要的
Comparator
,以执行此工作。

请参见集合中排序函数的签名:

public static <T extends Comparable<? super T>> void sort(List<T> list)

public static但是为什么我只在使用jdk7而不是jdk6运行时得到ClassCastException?当我仔细观察时,javadoc声明
TreeSet
应该在使用默认构造函数和添加不可比的
对象时抛出ClassCastException,JDK6中的
TreeSet
是如何排序的?您确定这只是在JDK7中出现的吗?这发生在我身上,我有jdk1.6u24I可以用jdk1.6.0_38运行它。我在jdk1.7.0_10中得到了runtimeerror,但是为什么我在使用jdk7而不是jdk6运行时只得到ClassCastException呢?