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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jkenny 中级黑马   /  2014-3-6 17:40  /  1161 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.*;
  2. class Person
  3. {
  4.         private String name;
  5.         Person(String name){
  6.                 this.name=name;
  7.         }

  8.         public String getName(){
  9.                 return name;
  10.         }
  11. }

  12. class A extends Person
  13. {
  14.         A(String name){
  15.                 super(name);
  16.         }
  17. }

  18. public class Test
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.                 TreeSet<Person> ts=new TreeSet<Person>(new MyCompare());
  23.                 ts.add(new Person("Person01"));
  24.                 ts.add(new Person("Person04"));
  25.                 ts.add(new Person("Person03"));

  26.                 TreeSet<A> ts1=new TreeSet<A>(new MyCompare());
  27.                 ts1.add(new A("A01"));
  28.                 ts1.add(new A("A04"));
  29.                 ts1.add(new A("A03"));
  30.                
  31.                 printTS(ts1);
  32.         }

  33.         //为什么使用<? super A>就会出现找不到:方法 getName()
  34.         //A类和A类的父类也都有getName()方法啊。
  35.         public static void printTS(TreeSet<? super A> ts){
  36.                 for(Iterator<? super A> itr=ts.iterator();itr.hasNext();){
  37.                         System.out.println(itr.next().getName());
  38.                         //这里将getName(),改成toString()就不会有问题。
  39.                         //那么是不是可以理解编译时找A的父类不是找到Person,而是找到了Object
  40.                         //所以才没找到方法 getName()
  41.                 }
  42.         }
  43.         /*
  44.         //使用<? extends A>就没有问题,因为A类中有getName()方法。
  45.         public static void printTS(TreeSet<? extends A> ts){
  46.                 for(Iterator<? extends A> itr=ts.iterator();itr.hasNext();){
  47.                         System.out.println(itr.next().getName());
  48.                 }
  49.         }
  50.         */


  51. }

  52. class MyCompare implements Comparator<Person>
  53. {
  54.         public int compare(Person o1,Person o2){
  55.                 return o2.getName().compareTo(o1.getName());
  56.         }
  57. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 asvsass 于 2014-3-6 18:11 编辑

? Super A 就是说A的父类都可以 Itr.next 返回的是Object类型  要强转换成 Person就可以了 Object就没有getName方法 所以不行
? extends A 就是说A的子类都可以   Itr.next 返回的是A类型  A的类型肯定有getName方法 所以可以

public static void printTS(TreeSet<? super A> ts){
                for(Iterator<? super A> itr=ts.iterator();itr.hasNext();){
                        System.out.println(((Person)itr.next()).getName());
                        //这里将getName(),改成toString()就不会有问题。
                        //那么是不是可以理解编译时找A的父类不是找到Person,而是找到了Object
                        //所以才没找到方法 getName()
                }
        }
半你修改了下 红色的部分

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
    如果只指定了<?>,而没有extends,则默认是允许Object及其下的任何Java类了。也就是任意类。
    通配符泛型不单可以向下限制,如<? extends Collection>,还可以向上限制,如<? super Double>,表示类型只能接受Double及其上层父类类型,如Number、Object类型的实例。
    泛型类定义可以有多个泛型参数,中间用逗号隔开,还可以定义泛型接口,泛型方法。这些都与泛型类中泛型的使用规则类似。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马