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

© 邵阳 中级黑马   /  2012-7-20 17:07  /  1684 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邵阳 于 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 个错误


求解,并改正

2 个回复

倒序浏览
首先看一下Collection<? super E> and Collection<?extends E>
<? super Student>的意思可以接收Student类型的所有父类型,Object是一切类的父类,看错误也可以看到,错误产生自Object类,查阅API知道Object类是没有getName()方法的,所以编译会出错,可以改成<? extends Person>,意思是可以接收继承自Person类的所有类型(包括父类类型的对象),Person类中有getName方法,编译就不会出错了。

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
韦念欣 + 1 赞一个!
邵阳 + 3

查看全部评分

回复 使用道具 举报
另附上代码如下:
  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. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马