黑马程序员技术交流社区

标题: 泛型静态方法的局限性 [打印本页]

作者: 王杰    时间: 2012-3-22 19:34
标题: 泛型静态方法的局限性
本帖最后由 王杰 于 2012-3-23 08:22 编辑

这是一个利用迭代器打印元素的方法,希望能够实现对人类,学生类和工人类的打印:
        public static <T> void sop(Collection<T> ts)//这个地方这样定义对吗?
        {
                for (Iterator<T> it = ts.iterator();it.hasNext() ; )
                {
                                           Object t =it.next();
                                           if(!(t instanceof T))
                                                 throw new ClassCastException("类型不匹配");
                        T p =(T)t;//T代表未知类型,当调用sop方法的时候就能确定,对吗?
                        System.out.println(p.getName()+"....."+p.getAge());//人类中的方法,已经定义了。
                }
        }
注意:人类,学生类,工人类没有写出。学生类和工人类都继承人类。默认传入的都是人,所以省略了instanceof判断。

这个方法编译是出错的。为什么。
我的猜想是:静态泛型函数访问的方法只能是Object类中定义的方法。因为如果访问自定义的方法。那么就存在安全隐患。因为类型未知。但是却访问了非Object的方法。

以下是我做的验证,结果却与我的猜想不同:
  1. package day15;
  2. class Demo
  3. {
  4.         public void show()
  5.         {
  6.                 System.out.println("Demo show()...run!");
  7.         }
  8. }
  9. class Test<T>
  10. {
  11.         public void method1(T t)
  12.         {
  13.                 if(!(t instanceof Demo))
  14.                         throw new RuntimeException("类型转换异常");

  15.                 Demo d = (Demo)t;
  16.                 d.show();
  17.         }
  18.         public static <M> void method2(M m)
  19.         {
  20.                 if(!(m instanceof Demo))
  21.                         throw new RuntimeException("类型转换异常");

  22.                 Demo d = (Demo)m;
  23.                 d.show();
  24.                 System.out.println("method2 .... run ");
  25.                
  26.         }
  27. }
  28. class DemoTest
  29. {
  30.         public static void main(String[] args)
  31.         {
  32.                 Test<Demo> td = new Test<Demo>();
  33.                 td.method1(new Demo());
  34.                 Test.method2(new Demo());
  35.         }
  36. }
  37. //运行结果:
  38. //Demo show()...run!
  39. //Demo show()...run!
  40. //method2 .... run
复制代码
[qq]305204604[/qq]


以下是完整代码:
  1. package day15;
  2. import java.util.*;
  3. public class TreeSetTest
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 TreeSet<Student> ts = new TreeSet<Student>(new MyCom());
  8.                 ts.add(new Student("nihao03",16));
  9.                 ts.add(new Student("nihao01",12));
  10.                 ts.add(new Student("nihao02",18));
  11.                 sop(ts);
  12.                
  13.                 TreeSet<Worker> ts1 = new TreeSet<Worker>(new MyCom());
  14.                 ts1.add(new Worker("wnihao03--",16));
  15.                 ts1.add(new Worker("wnihao01--",12));
  16.                 ts1.add(new Worker("wnihao02--",18));
  17.                 sop(ts1);
  18.         }
  19. //        public static void sop(Collection<? extends Person> ts)
  20. //        {
  21. //                for (Iterator<? extends Person> it = ts.iterator();it.hasNext() ; )
  22. //                {
  23. //                        Person p = it.next();
  24. //                        System.out.println(p.getName()+"....."+p.getAge());
  25. //                }
  26. //        }
  27. //
  28.         public static <T> void sop(TreeSet<T> ts)
  29.         {
  30.                 for (Iterator<T> it = ts.iterator();it.hasNext() ; )
  31.                 {
  32.                         T p =(T)it.next();
  33.                         System.out.println(p.getName()+"....."+p.getAge());
  34.                 }
  35.         }

  36. }
  37. class Person //implements Comparable//实现Comparable接口,复写compareTo方法。
  38. {
  39.         private String name;
  40.         private int age;
  41.         Person(String name,int age)
  42.         {
  43.                 this.name=name;
  44.                 this.age=age;
  45.         }

  46.         public void setName(String name)
  47.         {
  48.                 this.name = name;
  49.         }
  50.         public String getName()
  51.         {
  52.                 return name;
  53.         }

  54.         public void setAge(int age)
  55.         {
  56.                 this.age = age;
  57.         }
  58.         public int getAge()
  59.         {
  60.                 return age;
  61.         }

  62.         public int hashCode()
  63.         {
  64.                 System.out.println(name+"..........hashCode");
  65.                 return age;
  66.         }

  67.         public boolean equals(Object obj)
  68.         {
  69.                 if(!(obj instanceof Person))
  70.                         return false;
  71.                 Person p = (Person)obj;
  72.                 return this.name.equals(p.name) && this.age==p.age;

  73.         }


  74. //        public int compareTo(Object obj)
  75. //        {
  76. //                if(!(obj instanceof Person))
  77. //                        throw new RuntimeException("不是Person类");
  78. //                Person p=(Person)obj;
  79. //
  80. //                int num = new Integer(this.getAge()).compareTo(new Integer(p.getAge()));
  81. //                if(num==0)
  82. //                        return new String(this.getName()).compareTo(new String(p.getName()));
  83. //                return num;
  84. //        }
  85. }

  86. class Student extends Person
  87. {
  88.         Student(String name,int age)
  89.         {
  90.                 super(name,age);
  91.         }
  92. }

  93. class MyCom implements Comparator<Person>
  94. {
  95.         public int compare(Person p1,Person p2)
  96.         {
  97.                 int num = new String(p1.getName()).compareTo(new String(p2.getName()));
  98.                 if(num==0)
  99.                         return (p1.getAge()-p2.getAge());
  100.                 return num;
  101.         }
  102. }
  103. class Worker extends Person
  104. {
  105.         Worker(String name,int age)
  106.         {
  107.                 super(name,age);
  108.         }
  109. }
复制代码

作者: 王杰    时间: 2012-3-22 19:35
自己顶一下


作者: 刘元霄    时间: 2012-3-22 20:08
看了你的我突然觉得 我貌似什么都没学会啊 - -!  视频快看完了 在想能不能报上8期呢!
很纠结!
作者: 王杰    时间: 2012-3-22 20:32
再顶一下
作者: 王杰    时间: 2012-3-22 21:08
看了一下api,没有我这样定义的格式。可是为什么提示的错误并不是语法错误呀。提示getName和getAge无法识别。
作者: 王杰    时间: 2012-3-23 08:26
{:soso__11820362697368178998_4:}
作者: 张锦萍    时间: 2012-3-23 08:52
把那个class Person类的属性private int age;
改成private Integer  age 试试

        

作者: 王杰    时间: 2012-3-23 12:21
张锦萍 发表于 2012-3-23 08:52
把那个class Person类的属性private int age;
改成private Integer  age 试试

不管这个的事 还是不行。
作者: 王杰    时间: 2012-3-23 12:26
再再顶一下
作者: 王杰    时间: 2012-3-24 19:40
自己顶一下




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