public class Mixup {
   public static void main(String[] args) {
      Object o = new Object();
      TreeSet s = new TreeSet();
      s.add(o);
   }
}Object没有实现Comparable可不会编译出错。

解决方案 »

  1.   

    TreeSet的定义里面的确没有元素的范型一定要Comparable<? super T>,所以能通过编译。
      

  2.   

    可以不实现Comparable的,没有强制要求.编译器也不会强制你实现Comparable但是当你add多个没有实现Comparable对象后运行时就会出现异常
      

  3.   

    楼上的都已经回答了,附个代码更加清晰public class TreeMapTest {
    /**
     * @param args
     */
     public static void main(String[] args) {
          Object o = new Object();
          Preson p1 = new Preson("one","1");
          Preson p2 = new Preson("two","2");
          TreeSet s = new TreeSet();
          s.add(p1);
          s.add(p2);
          Iterator it = s.iterator();
          while(it.hasNext()){
           System.out.println(it.next());
          }
       }
    }
    class Preson{
    private String name;
    private String age;
    public Preson(String name,String age){
    this.name = name ;
    this.age = age;
    }
    public String toString(){
    return "name"+this.name+"-- age:"+this.age;
    }
    }
      

  4.   

      s.add(p1);
              s.add(p2);
    必然要出错的,没有实现Comparable接口。
      

  5.   

    编译不会报错,但是运行时会抛出ClassCastException异常可以测试的
    import java.util.TreeSet;
    public class TreeMapTest {
         public static void main(String[] args) {
              Object o1 = new Object();
              Object o2 = new Object();
              TreeSet s = new TreeSet();
              try{
                  s.add(o1);
                  s.add(o2);
              }catch(Exception e){
               System.out.println(e);
              }
           }
    }
      

  6.   

    恩,这个问题的根本就是TreeSet的设计问题。
    原本它可以在编译时候依靠generic来检查,代码就像这样:
    class TreeSet<E extends Comparable>.....
    这样的话就能在编译时候做检查。但是这样的话,就有了矛盾:那些没实现Comparable但是靠Comparator的机制就不行了。