A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙汇川 黑马帝   /  2012-2-19 12:03  /  3001 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

TreeSet 文档上写的是 TreeSet(Comparator<? super E> comparator)
比较器的泛型应该是任意类型或者其父类型,但是为什么<>中写Person类是,可以在TreeSet建立时比较Student和Worker类的对象?
虽然没有写<? super E>但是写Person也应该是比较Person本身或者其父类,为什么可以比较Person类的子类?那不跟<? extends E>的功能一样了吗?
另<? super E>什么时候用呢?

下面写个程序大家好明白我问问题的意思。
  1. import java.util.*;
  2. class GenericDemo7
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                
  7.                 TreeSet<Student> ts = new TreeSet<Student>(new Comp());

  8.                 ts.add(new Student("abc03"));
  9.                 ts.add(new Student("abc02"));
  10.                 ts.add(new Student("abc06"));
  11.                 ts.add(new Student("abc01"));
  12.                
  13.                 Iterator<Student> it = ts.iterator();

  14.                 while(it.hasNext())
  15.                 {
  16.                         System.out.println(it.next().getName());
  17.                 }
  18.                 /**/



  19.                 TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());

  20.                 ts1.add(new Worker("wabc--03"));
  21.                 ts1.add(new Worker("wabc--02"));
  22.                 ts1.add(new Worker("wabc--06"));
  23.                 ts1.add(new Worker("wabc--01"));


  24.                 Iterator<Worker> it1 = ts1.iterator();

  25.                 while(it1.hasNext())
  26.                 {
  27.                         System.out.println(it1.next().getName());
  28.                 }
  29.         }
  30. }



  31. class Comp implements Comparator<Person>
  32. {
  33.         public int compare(Person p1,Person p2)
  34.         {
  35.                 return p2.getName().compareTo(p1.getName());
  36.         }
  37. }


  38. class Person
  39. {
  40.         private String name;
  41.         Person(String name)
  42.         {
  43.                 this.name = name;
  44.         }
  45.         public String getName()
  46.         {
  47.                 return name;
  48.         }
  49.         public String toString()
  50.         {
  51.                 return "person :"+name;
  52.         }
  53. }

  54. class Student extends Person
  55. {
  56.         Student(String name)
  57.         {
  58.                 super(name);
  59.         }

  60. }

  61. class Worker extends Person
  62. {
  63.         Worker(String name)
  64.         {
  65.                 super(name);
  66.         }
  67. }
复制代码

1 个回复

倒序浏览
这是我的笔记,
你看一下,
泛型
       几个术语:
                 ArrayList<E>中的E称为类型变量或类型参数
                 整个称为ArrayList<E>泛型类型
                 整个ArrayList<Integer>称为参数化的类型
                 ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数
                 ArrayList称为原始类型
        <1>.泛型要注意的几个问题
                 1.参数化类型和原始类型互不兼容
                 2.参数化类型不考虑类型参数的继承关系      
                 3.泛型不能应用于数组           
        <2>.泛型中的?通配符
                 使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无                关的方法,不能调用与参数化有关的方法。例如:不能调用ArrayList类的add()方法,但是可以调用                    ArrayList类的size()方法。
        <3>.泛型中的?通配符的扩展
                 1.限定通配符的上边界(即参数类型只能是这个类或者是继承这个类的子类):
                    示例:正确:Vector<? extends Number> x = new Vector<Integer>();
                          错误:Vector<? extends Number> x = new Vector<Date>();
                 2.限定通配符的下边界:
                          示例:Vector<? super Integer> x = new Vector<Number>();
                 注:限定通配符总是包括自己。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马