黑马程序员技术交流社区

标题: 一个关于泛型的问题? [打印本页]

作者: 高鑫    时间: 2012-6-6 18:29
标题: 一个关于泛型的问题?
  1. import java.util.*;
  2. class  Demo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 //TreeSet(Comparator<? super E> comparator)
  7.                 TreeSet<Student> ts = new TreeSet<Student>(new CompareByName());

  8.                 ts.add(new Student("s1"));
  9.                 ts.add(new Student("s3"));
  10.                 ts.add(new Student("s2"));
  11.                 ts.add(new Student("s0"));

  12.                 System.out.println(ts);

  13.         }
  14. }
  15. class CompareByName implements Comparator<Person>  //<Person> 写成<? extends Person>为什么不能通过
  16. {
  17.         public int compare(Person s1,Person s2)
  18.         {
  19.                 return s1.getName().compareTo(s2.getName());
  20.         }
  21. }


  22. class Person
  23. {
  24.         private String name;
  25.         Person(String name)
  26.         {
  27.                 this.name = name;
  28.         }
  29.         public String getName()
  30.         {
  31.                 return name;
  32.         }
  33.         public String toString()
  34.         {
  35.                 return "name:"+name;
  36.         }
  37. }
  38. class Student extends Person
  39. {
  40.         Student(String name)
  41.         {
  42.                 super(name);
  43.         }
  44.        
  45. }
复制代码
问题是在标注的地方为什么<Person>不能写成<? extends Person>,如果要这样写,怎么改动程序呢??
作者: 龙秋地    时间: 2012-6-6 18:41
楼主,如果有机会可以查一下JDK API
java.util 包中
接口 Comparator<T>,他中的泛型只能一个确切的对象,而不是可以继承父类的子类.
public interface Comparator<T>比较函数强行对某些对象 collection 进行整体排序。
可以将 Comparator 传递给 sort 方法(如 Collections.sort),从而允许在排序顺序上实现精确控制。
还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序。

至于楼主的意思可能把他误以为是方法了.
这是我查找API官方的方法:
Comparator<? super K> comparator()
          返回用于对此映射进行排序的比较器,如果此映射使用它的键的自然顺序,则返回 null。
Comparator<? super E> comparator()
          返回用于确定已排序 set 顺序的比较器,或者,如果此树 set 使用其元素的自然顺序,则返回 null。
这个方法还有几个类中有,是java.util.concurrent.PriorityBlockingQueue.comparator()
java.util.PriorityQueue.comparator()
java.util.SortedMap.comparator()
java.util.SortedSet.comparator()
java.util.TreeMap.comparator()
java.util.TreeSet.comparator() .
这些方法都可以像楼主使用的那样泛型中使用继承父类的子类或者是父类本身.



作者: 高鑫    时间: 2012-6-6 20:56
龙秋地 发表于 2012-6-6 18:41
楼主,如果有机会可以查一下JDK API
java.util 包中
接口 Comparator,他中的泛型只能一个确切的对象,而不是 ...

谢谢,明白了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2