| Person类 
 Student类继承Person类复制代码class Person implements Comparable<Person>{
    private int age ;
    private int id;
    public Person(int age,int id){
    this.age = age;
    this.id = id;
     }
public int compareTo(Person o) {     //实现接口的compareTo方法
int num = new Integer(age).compareTo(o.age);
if(num == 0)
return new Integer(id).compareTo(o.id);
return num;
}
}
 主函数:泛型为父类复制代码class Student extends Person{
private String name;
public Student(int age, int id,String name) {
super(age, id);
this.name = name;
}
public int compareTo(Student stu)  //复写继承来的比较方法
{
return name.compareTo(stu.name); //只比较name
}
}
 一个方法:泛型为子类复制代码
<P>public static void main(String[] args) throws Exception {
TreeSet<Person> ts = new TreeSet<Person>();
ts.add(new Person(1,2));
ts.add(new Person(1,3));
ts.add(new Person(1,4));
ts.add(new Student(1,4,"zhao"));
System.out.println(ts.size());                                //输出3</P>
<P>
//反射添加一个Student对象
Class<?> clazz = ts.getClass();
Method meth = clazz.getMethod("add", Object.class);
meth.invoke(ts, new Student(1,2,"zhao"));
System.out.println(ts.size());                             //输出3</P>
<P>
meth.invoke(ts, new Student(1,5,"zhao"));
System.out.println(ts.size());                           //输出4</P>
<P>
 </P>
 一个方法:不用泛型复制代码public static void fanTree()throws Exception
{
TreeSet<Student> ts = new TreeSet<Student>();
//ts.add(new Person(1,2));                   //无法添加
ts.add(new Student(1,2,"zhao"));
System.out.println(ts.size());                //输出1
//反射添加一个父类Person对象
Class<?> clazz = ts.getClass();
Method meth = clazz.getMethod("add", Object.class);
meth.invoke(ts, new Student(1,2,"zhang"));
System.out.println(ts.size());               //输出1
meth.invoke(ts, new Person(1,2));
System.out.println(ts.size());              //输出1
}
 一个方法:不带泛型2复制代码public static void treeSet()
{
TreeSet ts = new TreeSet();
ts.add(new Person(1,2));
ts.add(new Person(1,3));
ts.add(new Person(1,4));
System.out.println(ts.size());   //输出3
ts.add(new Student(1,4,"zhao"));
System.out.println(ts.size());   //输出3
}
 在加了泛型的情况下很明确  你泛型规定的谁,就是用的谁的。复制代码
<P>public static void treeSet2()
{
TreeSet ts = new TreeSet();
ts.add(new Student(1,4,"zhao"));
ts.add(new Person(1,2));
ts.add(new Person(1,3));
ts.add(new Person(1,4));
System.out.println(ts.size()); //输出3
ts.add(new Student(1,4,"zhang"));
System.out.println(ts.size()); //输出3
for(Iterator it = ts.iterator(); it.hasNext();)
{
System.out.println(it.next());     //结果:<A href="mailto:com.bbs.itheima.Person@1313906">com.bbs.itheima.Person@1313906</A>
                                                                 <A href="mailto:com.bbs.itheima.Person@96cf11">com.bbs.itheima.Person@96cf11</A>
                                                                 <A href="mailto:com.bbs.itheima.Student@f47bf5">com.bbs.itheima.Student@f47bf5</A>}</P>
<P>                                               //说明将ts.add(new Student(1,4,"zhao"));添加进去了。但是ts.add(new Person(1,4));没有添加进去。</P>
<P>                                                ts.add(new Student(1,4,"zhang"));这个并没有添加进去。
}</P>
但是 如果规定了是子类,那么父类是添加不进去的,因为父类实例对象无法向子类转型。
 用反射将 一个父类的对象添加进去。是可以添加进去的。他还是用的父类的compareTo在比较。
 
 在不加泛型的情况下,父类和子类都可以添加进去。
 但是如果添加的子类的age和id 比较的是0。那么还是添加不进去的。
 
 感觉应该根据的是   子类能向父类转型,但是父类无法向子类转型。
 
 
 
 |