插入 TreeSet 时出现 ClassCastException

ClassCastException when inserting into a TreeSet

具有以下Java TreeSet

TreeSet<Widget> tabs = new TreeSet<Widget>();

当我在方法 a() 中执行 tabs.add(new Widget()); 时,它起作用了。当我在执行第一次插入后不久在方法 b() 中执行相同操作时,我出现了 ClassCastException。

改变

ArrayList<Widget> tabs = new ArrayList<Widget>();

它在 a() 和 b() 方法中都工作正常,没有任何错误。我想知道为什么第一个示例中有 ClassCastException。没有铸造到位。

编辑:这是方法 a、b 和小部件 class:

 private void a() {
   tabs.add(new Widget());
 }

 private void b() {
   tabs.add(new Widget());
 }

public class Widget() {}

如何使第一个示例起作用?

当您添加到 TreeSet 时,您传递的对象必须实现 Comparable 您必须在构建 TreeSet 的时间。

来自JavaDoc

The elements are ordered using their natural ordering, or by a Comparator provided at set creation time, depending on which constructor is used.

JavaDoc for TreeSet.add(E) 甚至告诉你为什么会这样...

ClassCastException - if the specified object cannot be compared with the elements currently in this set