import java.util.Set;
import java.util.*;class SetType
{
int i;
public SetType(int n){i = n;}
public boolean equals(Object o)
{
return o instanceof SetType &&(i ==((SetType)o).i);
}
public String toString(){return Integer.toString(i);}
}class HashType extends SetType
{
    public HashType(int n){super(n);}
    public int hashCode(){return i;}
}
class TreeType extends SetType implements Comparable<TreeType>
{
public TreeType(int n){super(n);}
public int compareTo(TreeType arg)
{
return (arg.i < i ? -1:(arg.i == i ? 0 : 1));
}

}
public class SetTest 
{
static <T> Set<T> fill(Set<T> set, Class<T> type)
{
try
{
for(int i = 0; i < 10; i++)
set.add(type.getConstructor(int.class).newInstance(i));
}
catch(Exception e){throw new RuntimeException(e);}
    
return set;
}
    static <T> void test(Set<T> set,Class<T> type)
    {
     fill(set,type);
     fill(set,type);
     fill(set,type);
     System.out.println(set);
    }
    public static void main(String[] args)
    {
     test(new HashSet<HashType>(),HashType.class);
     test(new LinkedHashSet<HashType>(),HashType.class);
     test(new TreeSet<TreeType>(),TreeType.class);
     //test(new TreeSet<SetType>(),SetType.class);  这里会报错,因SetType没实现comparable方法,不明白
     TreeSet<SetType> setType = new TreeSet<SetType>(); //这样就可以使用<SetType>不理解
     setType.add(new SetType(1));
     System.out.println(setType);
    }
}请高手指点下

解决方案 »

  1.   


    //照样报错
    public static void main(String[] args)
      {
      //test(new HashSet<HashType>(),HashType.class);
      //test(new LinkedHashSet<HashType>(),HashType.class);
      //test(new TreeSet<TreeType>(),TreeType.class);
      //test(new TreeSet<SetType>(),SetType.class); 这里会报错,因SetType没实现comparable方法,不明白
       TreeSet<SetType> setType = new TreeSet<SetType>(); //这样就可以使用<SetType>不理解 setType.add(new SetType(1));//添加元素的时候要进行排序,不实现comparable是不可以的
       setType.add(new SetType(1));
       setType.add(new SetType(2));
       //System.out.println(setType);
      }
      

  2.   

    我并不太明白你问什么对于TreeSet来说,添加到这个TreeSet的元素必须实现Comparable(或者在TreeSet构造方法中指定Comparator)TreeSet<SetType> setType = new TreeSet<SetType>();这个<SetType>其实只是编译器完成的事情,TreeSet代码中并不能判断你指定的类型是什么,所以不会有异常。但是在你添加元素的时候会判断出来。这个是由Java的泛型机制决定的。
      

  3.   

    这个添加两个setType.add(new SetType(1));
       setType.add(new SetType(2));
    像这样就会出错,而一个不会出的,那会是为什么,加一个时候不用调用Comparable()方法是不?
      

  4.   

    TreeSet treeSet = new TreeSet();
    然后treeSet.add(1);treeSet.add(2);
    这样写是怎样的解释??
      

  5.   


    SetType需要实现Comparable接口才可以,Integer已经实现了这个接口
    往TreeSet里面添加数据的时候,会进行比较大小,因此,必须实现Comparable接口
      

  6.   

    概念上先了解,
    首先,TreeSet 是 OrderedSet 子类型,也就是有排序的。
    其实,对象类型“谁大谁小”先天上不具备像 int 这样的大小次序,需要我们告诉API 一个对象和同类型的另一个对象如何比较大小,所以,里面如果只有一个对象那没事,如果有多个就需要比较,然后排序。有上面两条就应该明白,为什么需要 Comparable 接口,而 TreeSet 为什么会报错。先看技术的使用,熟悉之后要看从概念上理清思路,这样才能更快地看懂别人的设计来了解更大型的软件,否则,很多的时间都是在琐碎的细节上纠缠不清。