黑马程序员技术交流社区

标题: 求帮忙分析一个泛型问题。 [打印本页]

作者: 王靖远    时间: 2013-6-30 11:19
标题: 求帮忙分析一个泛型问题。
  1. package test;

  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. import java.util.ArrayList;
  5. import java.util.Collection;
  6. import java.util.HashSet;
  7. import java.util.Iterator;

  8. public class Test2 {

  9.       
  10.     public static void main(String[] args)throws Exception {
  11.                 ArrayList<Worker> al = new ArrayList<Worker>();
  12.                 al.add(new Worker("张三"));
  13.                 al.add(new Worker("李四"));
  14.                 al.add(new Worker("王五"));
  15.                 show1(al);
  16.                 show2(al);
  17.                 show3(al);
  18.                 show4(al);
  19.                
  20.                 HashSet<Student> hs = new HashSet<Student>();
  21.                 hs.add(new Student("赵六"));
  22.                 hs.add(new Student("冯七"));
  23.                 hs.add(new Student("天一"));
  24.                show1(hs);
  25.                show2(hs);
  26.                show3(hs);
  27.                show4(hs);
  28.                
  29.                
  30.                
  31.                        
  32.                
  33.                
  34.         }

  35.       
  36.     private static <Person> void show1(Collection<Person> al) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {//此处为什么不能用Person,必须用通用符吗,为什么也不能用Object,不是说父类指向子类吗,为什么写父类类型不行?
  37.                 Iterator<Person> it = al.iterator();
  38.                 while(it.hasNext()) {
  39.                 Person p =        it.next();//<font color="#ff0000">这里的p不知道是什么。没法调用Person类里的getName()方法。其他3种泛型的show方法里p都可以调用getName()方法。</font>
  40.                

  41.                        
  42.                         Method method = p.getClass().getMethod("getName");
  43.                System.out.println(method.invoke(p));
  44.                 }
  45.                         
  46.                
  47.         }
  48.         
  49.             private static <T>void show2(Collection<T> al) {
  50.                 Iterator<T> it = al.iterator();
  51.                 while(it.hasNext()) {
  52.                        
  53.                         Person p = (Person)it.next();
  54.                         
  55.                         System.out.println(p);
  56.                        System.out.println( p.getName());
  57.                 }
  58.         }

  59.       
  60.             private static<Object> void show3(Collection<Object> al) {
  61.                 Iterator<Object> it = al.iterator();
  62.                 while(it.hasNext()) {
  63.                        
  64.                         Person p = (Person)it.next();
  65.                         System.out.println(p);
  66.                         System.out.println(p.getName());
  67.                 }
  68.         }//这么改,改成Object类型,为什么程序是对的

  69.         
  70.         private static<Worker> void show4(Collection<Worker> al) {
  71.                 Iterator<Worker> it = al.iterator();
  72.                 while(it.hasNext()) {
  73.                      
  74.                         Person p = (Person)it.next();
  75.                         System.out.println(p);
  76.                         System.out.println( p.getName());
  77.                 }
  78.         }//如果类型改成Worker或者Student类型,为什么运行是对的,改成他们的父类就是错的呢,改成Object类型就是对的呢???

  79. }
复制代码
  1. package test;

  2. public class Person {
  3.     private String name;

  4.     public String getName() {
  5.             return name;
  6.     }

  7.     public void setName(String name) {
  8.             this.name = name;
  9.     }

  10.     public Person(String name) {
  11.             super();
  12.             this.name = name;
  13.     }
  14.    
  15. }
复制代码
  1. package test;

  2. public class Student extends Person {
  3.        
  4.         public Student(String name) {
  5.                 super(name);
  6.                
  7.         }
  8.         

  9. }
复制代码
  1. package test;

  2. public class Worker extends Person {

  3.     public Worker(String name) {
  4.             super(name);        
  5.     }
  6.    

  7. }
复制代码
这是我copy来的一段代码,求高手帮我分析。

作者: 王靖远    时间: 2013-6-30 11:38
参数类型定义成Person的子类和超类都可以。似乎只有Person不可以。
作者: 万琪    时间: 2013-6-30 23:05
你这个错误不明显,,

首先,,worker报错,,是因为(worker)person要强制转换,,

第二,你传进来的参数泛型需要压制,,有问题,
@SuppressWarnings({ "rawtypes", "hiding" })

作者: 王靖远    时间: 2013-6-30 23:10
万琪 发表于 2013-6-30 23:05
你这个错误不明显,,

首先,,worker报错,,是因为(worker)person要强制转换,,

<Worker>没有报错。和<Object> <T>一样 强转就可以了。 只有<Person>不可以 强转了也不可以。
我没搞定什么什么is hiding的那句。这个泛型需要压制是什么意思啊?
作者: 万琪    时间: 2013-6-30 23:25
要加也应该是Collection <? extends Person> al,
作者: 王靖远    时间: 2013-6-30 23:32
万琪 发表于 2013-6-30 23:25
要加也应该是Collection

好像Person的父类Object和子类Worker都可以 就Person不可以。
作者: 万琪    时间: 2013-6-30 23:50
如果穿进去的事Person呢,,
作者: 张云杰    时间: 2013-7-1 03:03
老毕第15天的的12课.. 认真在复习下..这么快就忘了
作者: 张云杰    时间: 2013-7-1 03:05
万琪 发表于 2013-6-30 23:05
你这个错误不明显,,

首先,,worker报错,,是因为(worker)person要强制转换,,

不用压制吧?!! 他只要限定一下 字父类的泛型就行了




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