黑马程序员技术交流社区

标题: 各位亲看过来!关于? super E [打印本页]

作者: 邵阳    时间: 2012-7-20 17:07
标题: 各位亲看过来!关于? super E
本帖最后由 邵阳 于 2012-7-20 18:19 编辑

写了一个程序:
import java.util.*;

class Demo
{
        public static void main(String[]args)
        {
                ArrayList <Person>arr1=new ArrayList<Person>();
                arr1.add(new Person("lisi1"));
                arr1.add(new Person("lisi2"));
                arr1.add(new Person("lisi3"));
                arr1.add(new Person("lisi4"));
                printColl(arr1);
                ArrayList <Student>arr2=new ArrayList<Student>();
                arr2.add(new Student("lisi--1"));
                arr2.add(new Student("lisi--2"));
                arr2.add(new Student("lisi--3"));
                arr2.add(new Student("lisi--4"));
                printColl(arr2);


        }
        public static void printColl(ArrayList<? super Student> arr)
        {
                Iterator<? super Student>it=arr.iterator();
                while (it.hasNext())
                {
                        System.out.println(it.next().getName());
                }
        }
}
class Person
{
        private String name;
        Person(String name)
        {
                this.name=name;
        }
        public String getName()
        {
                return name;
        }
}
class Student extends Person
{
        Student(String name)
        {
                super(name);
        }
}

柑橘应该可以吧,不是可以接受子类及子类的父类吗?

怎么结果是
D:\java\zuoye\fanxing>javac d.java
d.java:298: 错误: 找不到符号
                        System.out.println(it.next().getName());
                                                    ^
  符号:   方法 getName()
  位置: 类 Object
1 个错误


求解,并改正
作者: 王宝康    时间: 2012-7-20 17:32
首先看一下Collection<? super E> and Collection<?extends E>
<? super Student>的意思可以接收Student类型的所有父类型,Object是一切类的父类,看错误也可以看到,错误产生自Object类,查阅API知道Object类是没有getName()方法的,所以编译会出错,可以改成<? extends Person>,意思是可以接收继承自Person类的所有类型(包括父类类型的对象),Person类中有getName方法,编译就不会出错了。
作者: 王宝康    时间: 2012-7-20 17:41
另附上代码如下:
  1. package collection;

  2. import java.util.*;
  3. /*
  4. * Collection<? extends E>可以接收继承自Person类的所有类型(包括父类类型的对象)
  5. * Collection<? super E>可以接收E类型的所有父类型(包括父类类型的对象)
  6. * */
  7. public class demo {
  8.         public static void main(String[] args) {
  9.                 ArrayList<Person1> arr1 = new ArrayList<Person1>();
  10.                 arr1.add(new Person1("lisi1"));
  11.                 arr1.add(new Person1("lisi2"));
  12.                 arr1.add(new Person1("lisi3"));
  13.                 arr1.add(new Person1("lisi4"));
  14.                 printColl(arr1);
  15.                 ArrayList<Student> arr2 = new ArrayList<Student>();
  16.                 arr2.add(new Student("lisi--1"));
  17.                 arr2.add(new Student("lisi--2"));
  18.                 arr2.add(new Student("lisi--3"));
  19.                 arr2.add(new Student("lisi--4"));
  20.                 printColl(arr2);
  21.         }

  22.         public static void printColl(ArrayList<? extends Person1> arr) {
  23.                 Iterator<? extends Person1> it = arr.iterator();
  24.                 while (it.hasNext()) {
  25.                         System.out.println((it.next().getName()));
  26.                         ;
  27.                 }
  28.         }
  29. }

  30. class Person1 {
  31.         private String name;

  32.         Person1(String name) {
  33.                 this.name = name;
  34.         }

  35.         public String getName() {
  36.                 return name;
  37.         }
  38. }

  39. class Student extends Person1 {
  40.         Student(String name) {
  41.                 super(name);
  42.         }
  43. }
复制代码





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