黑马程序员技术交流社区

标题: 求教:泛型限定中<? super E>不能继承父类方法么? [打印本页]

作者: zz_job    时间: 2014-8-7 16:56
标题: 求教:泛型限定中<? super E>不能继承父类方法么?
问题出现在毕老师JAVA基础视频第15天-12-集合框架(泛型限定)中
代码如下:



  1. import java.util.*;
  2. class GenericAsk
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                
  7.                 ArrayList<Person> al = new ArrayList<Person>();
  8.                 al.add(new Person("person01"));
  9.                 al.add(new Person("person02"));
  10.                 al.add(new Person("person04"));
  11.                 printColl(al);
  12.                
  13.                 ArrayList<Student> al1 = new ArrayList<Student>();
  14.                 al1.add(new Student("stu--01"));
  15.                 al1.add(new Student("stu--03"));
  16.                 al1.add(new Student("stu--05"));
  17.                 printColl(al1);
  18.                 //相当于ArrayList<Student> al = new ArrayList<Person>();        会报错
  19.                 //这个表达式两边的数据类型必须相同!
  20.                
  21.         }
  22.         /*
  23.         public static void printColl(ArrayList<? extends Person> al)
  24.         {
  25.                 Iterator<? extends Person> it = al.iterator();
  26.                 while(it.hasNext())
  27.                 {
  28.                         System.out.println(it.next().getName());
  29.                 }
  30.         }
  31.         */
  32.         public static void printColl(ArrayList<? super Student> al)
  33.         {
  34.                 Iterator<? super Student> it = al.iterator();
  35.                 while(it.hasNext())
  36.                 {
  37.                         System.out.println(it.next().getName());
  38.                 }
  39.         }
  40. }
  41. class Person
  42. {
  43.         private String name;
  44.         Person(String name)
  45.         {
  46.                 this.name = name;       
  47.         }
  48.         public String getName()
  49.         {
  50.                 return name;
  51.         }
  52. }
  53. class Student extends Person
  54. {
  55.         Student(String name)
  56.         {       
  57.                 super(name);
  58.         }
  59. }
复制代码

如果是用<? extends Person>就可以编译通过。
如果用<? super Student>就不能编译通过。报如下错误:
---------- 编译java程序 ----------
GenericAsk.java:37: 错误: 找不到符号
                        System.out.println(it.next().getName());
                                                                       ^
  符号:   方法 getName()
  位置: 类 Object
1 个错误

输出完成 (耗时 1 秒) - 正常终止

想问的是,子类不是可以直接继承父类的方法么?为什么这里就找不到getName()方法呢?

作者: 790324255a    时间: 2014-8-7 17:12
<? super E>下边界 指定类型是某个类型或其祖先类型 获取的对象是Object object没有getName()方法 编译时当然会报错
作者: zz_job    时间: 2014-8-7 17:22
790324255a 发表于 2014-8-7 17:12

大神你好!
可是如果是这样的话,<? super E>这种写法到底应该怎么应用呢? 因为只要这样一写,最终都会指向Object类了啊?
作者: kakasa    时间: 2014-8-7 17:39
应该这么写吧,
ArrayList<Person> al = new ArrayList<Person>();
al1.add(new Student("stu--01"));
al1.add(new Student("stu--03"));
al1.add(new Student("stu--05"));
作者: zz_job    时间: 2014-8-7 17:56
刚刚试了一下,<? super Student>这种写法确实指到Object类中去了。Object类中当然没有getName()方法了。
所以我想说的是,难道这种用法注定是只能调用Object类中的方法么?现在只能这么理解他的用法了。
如果说得不对。欢迎大神们踊跃跳出来打脸啊!!!

谢谢kakasa、790324255a回复啦~
作者: 790324255a    时间: 2014-8-7 21:08
zz_job 发表于 2014-8-7 17:22
大神你好!
可是如果是这样的话,

别这样称呼 我受不起:L 如果你想调用方法的话就选< ? extends E>  如果你想往集合中添加元素的话就用<? super E> 适合往一个集合中添加一个具有继承性质的对象 用于添加元素 可以限定添加的元素为E的子类  比如 通常我们定义一个集合 如果使用泛型 List<String> list=new ArrayList<String>();这时我们只能添加一种类型 而如果我们采用 List<? super E> list=new ArrayList(); 这时我们可以往集合中添加E的对象或E的子类 不止添加一种类型




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