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

© 李万海 中级黑马   /  2013-3-26 09:41  /  1376 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李万海 于 2013-3-27 12:47 编辑

在泛型中,我们将<? super E>定义为下限,只要是E或者E的父类都可以满足条件。
实际应用中,假设父类Father 定义了两个子类 SonOne,SonTwo
我们构建了个集合,TreeSet(Comparator<? super E> comparator) ,
在这里传入参数TreeSet<Comparator<Father> compator>
那么他的子类SonOne或者SonTwo的集合都可以使用这个comparator进行排序了。
这样跟<? extends E>有什么区别呢,只要是E或E的子类就能满足条件了?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

2 个回复

倒序浏览
在这里传入参数TreeSet<Comparator<Father> compator>
那么他的子类SonOne或者SonTwo的集合都可以使用这个comparator进行排序了。

你这话有问题吧,如果你定义的泛型限定是<? super SonOne>
那么只有SonOne 和Father 类的参数时可以编译通过
如果你定义的泛型限定是<? super SonTwo>
那么只有SonTwo和Father类的参数时可以编译通过
如果你定义的泛型限定是<? super Father>
那么只有Father类的参数时可以编译通过
当你用了不匹配的类型的时候就会报错,如图
  1. /**
  2. javaSE day15-12泛型限定
  3. */
  4. import java.util.*;
  5. class GenericDemo7
  6. {
  7.         public static void main(String[] args)
  8.         {

  9.                 ArrayList<Person> al = new ArrayList<Person>();
  10.                 al.add(new Person("abc1"));
  11.                 al.add(new Person("abc2"));
  12.                 al.add(new Person("abc3"));
  13.                 printColl(al);

  14.                 ArrayList<Student> all = new ArrayList<Student>();
  15.                 all.add(new Student("abc---1"));
  16.                 all.add(new Student("abc--2"));
  17.                 all.add(new Student("abc--3"));
  18.                 printColl(all);//ArrayList<Person> al = ArrayList<Student>();error

  19.         }        //指向和接收左右两边要一致

  20.         public static void printColl(ArrayList<? super Person> al)
  21.         {
  22.                 Iterator<? super Person> it = al.iterator();
  23.                 while(it.hasNext())
  24.                 {
  25.                         System.out.println(it.next().getName());
  26.                 }
  27.         }
  28. }
  29. class Person
  30. {
  31.         private String name;
  32.         Person(String name)
  33.         {
  34.                 this.name = name;
  35.         }
  36.         public String getName()
  37.         {
  38.                 return name;
  39.         }
  40. }
  41. class Student extends Person
  42. {
  43.         Student(String name)
  44.         {
  45.                 super(name);
  46.         }
  47. }
复制代码

2013-03-26_110806.png (6.74 KB, 下载次数: 2)

2013-03-26_110806.png

评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2

查看全部评分

回复 使用道具 举报
还有问题继续追问;没有的话,记得将帖子分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马