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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李彦来 中级黑马   /  2014-7-20 20:11  /  1133 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

TreeSet(Comparator<? super E> comparator)   TreeSet中有这么一个构造函数,在初始化时添加一个比较器,使用的就是<? super E> 这样的下限泛型限定
但是毕老师的代码实现中没发现使用下限限定,求解...
  1. import java.util.*;
  2. class TreeSetTest2
  3. {
  4.         public static void main(String[] args){
  5.                
  6.                 TreeSet<Person> pList=new TreeSet<Person>(new Comp());

  7.                 pList.add(new Person("abc126"));
  8.                 pList.add(new Person("abc127"));
  9.                 pList.add(new Person("abc123"));
  10.                 pList.add(new Person("abc124"));
  11.                 pList.add(new Person("abc125"));

  12.                 getColl(pList);
  13.         }

  14.         public static void getColl(TreeSet<? extends Person> pList){  //上限限定
  15.                 Iterator<? extends Person> it=pList.iterator();
  16.                 while(it.hasNext()){
  17.                         System.out.println(it.next().getName());
  18.                 }
  19.         }
  20. }

  21. class Comp implements Comparator<Person>  //如何实现下限限定???
  22. {
  23.         public int compare(Person p1,Person p2){
  24.                 return p1.getName().compareTo(p2.getName());
  25.         }
  26. }

  27. class Person
  28. {
  29.         private String name;
  30.         Person(String name){
  31.                 this.name=name;
  32.         }
  33.         public String getName(){
  34.                 return name;
  35.         }
  36. }
  37. class Student extends Person
  38. {
  39.         Student(String name){
  40.                 super(name);
  41.         }
  42. }
  43. class Worker extends Person
  44. {
  45.         Worker(String name){
  46.                 super(name);
  47.         }
  48. }
复制代码



10 个回复

倒序浏览
{:2_32:}{:2_32:}{:2_32:}{:2_32:}{:2_32:}{:2_32:}
回复 使用道具 举报
根据TreeSet<Person> pList=new TreeSet<Person>(new Comp());
这里的E为Person。那此时如下所示,class Comp implements Comparator<Person> ,Comparator的类型参数为Person,仍然在<? Super E>范围内。它其实就规定了下限就为Person。
回复 使用道具 举报
ddewym123 发表于 2014-7-20 21:36
根据TreeSet pList=new TreeSet(new Comp());
这里的E为Person。那此时如下所示,class Comp implements Co ...

可是当<Person> pList=new TreeSet<Person>(new Comp());的泛型变为Student时,也可以编译和运行,如果下限为Person,那Student是Person的子类,那Person不成了上限了吗?
回复 使用道具 举报
李彦来 发表于 2014-7-20 22:30
可是当 pList=new TreeSet(new Comp());的泛型变为Student时,也可以编译和运行,如果下限为Person,那Stude ...

如果<Person> pList=new TreeSet<Person>(new Comp());的泛型变为Student。那E就变为Student。那么Comparator的下限就变为Student
回复 使用道具 举报
hundianjingyan
回复 使用道具 举报
ddewym123 发表于 2014-7-20 22:33
如果 pList=new TreeSet(new Comp());的泛型变为Student。那E就变为Student。那么Comparator的下限就变为 ...

可是Comparator的泛型还是<Person> 啊???
回复 使用道具 举报
李彦来 发表于 2014-7-20 23:05
可是Comparator的泛型还是 啊???

此时Comparator的可选范围是<? super Student>,Person当然属于这个范围~
回复 使用道具 举报
ddewym123 发表于 2014-7-21 08:25
此时Comparator的可选范围是

Comparator<Person> 应该是<? super Person> 吧???怎么会是<? super Student> 呢???
哥们,我实在没搞懂,被烦躁哈...
回复 使用道具 举报

Comparator<? super E> 这里的E是由TreeSet<E>来决定的(请翻看JDK API中 TreeSet类),你如果设定TreeSet的实际参数类型为Person,则E为Person,则Comparator为<? super Person> ,那么Comparator实际类型参数就可以选择Person或Person的父类;同理,如果设定TreeSet的实际参数类型为Student,则E为Student,则Comparator为<? super Student> ,那么Comparator实际类型参数就可以选择Student或Student的父类,Person当然是Student的父类,所以正确。
回复 使用道具 举报

好像明白了,谢谢啊..
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马