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;
- }
- }
复制代码 Student类继承Person类
- 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
- }
复制代码 一个方法:不用泛型
- 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
- }
复制代码 一个方法:不带泛型2
- <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。那么还是添加不进去的。
感觉应该根据的是 子类能向父类转型,但是父类无法向子类转型。
|