黑马程序员技术交流社区

标题: 毕老师day15泛型限定2的问题 [打印本页]

作者: 李彦来    时间: 2014-7-20 20:11
标题: 毕老师day15泛型限定2的问题
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. }
复制代码




作者: 这个夏天的芬芳    时间: 2014-7-20 21:11
{:2_32:}{:2_32:}{:2_32:}{:2_32:}{:2_32:}{:2_32:}
作者: ddewym123    时间: 2014-7-20 21:36
根据TreeSet<Person> pList=new TreeSet<Person>(new Comp());
这里的E为Person。那此时如下所示,class Comp implements Comparator<Person> ,Comparator的类型参数为Person,仍然在<? Super E>范围内。它其实就规定了下限就为Person。
作者: 李彦来    时间: 2014-7-20 22:30
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不成了上限了吗?
作者: ddewym123    时间: 2014-7-20 22:33
李彦来 发表于 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
作者: 郭可    时间: 2014-7-20 22:49
hundianjingyan
作者: 李彦来    时间: 2014-7-20 23:05
ddewym123 发表于 2014-7-20 22:33
如果 pList=new TreeSet(new Comp());的泛型变为Student。那E就变为Student。那么Comparator的下限就变为 ...

可是Comparator的泛型还是<Person> 啊???
作者: ddewym123    时间: 2014-7-21 08:25
李彦来 发表于 2014-7-20 23:05
可是Comparator的泛型还是 啊???

此时Comparator的可选范围是<? super Student>,Person当然属于这个范围~
作者: 李彦来    时间: 2014-7-21 08:40
ddewym123 发表于 2014-7-21 08:25
此时Comparator的可选范围是

Comparator<Person> 应该是<? super Person> 吧???怎么会是<? super Student> 呢???
哥们,我实在没搞懂,被烦躁哈...
作者: ddewym123    时间: 2014-7-21 09:14
李彦来 发表于 2014-7-21 08:40
Comparator 应该是

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的父类,所以正确。
作者: 李彦来    时间: 2014-7-21 09:54
ddewym123 发表于 2014-7-21 09:14
Comparator

好像明白了,谢谢啊..




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