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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Zhang_qian 中级黑马   /  2012-5-21 00:10  /  1974 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class GenericDemo1
{
        public static void main(String[] args)
        {
               
                TreeSet<Student> s=new TreeSet<Student>(new Comp());
                s.add(new Student("aaa",23));
                s.add(new Student("ccc",24));
                s.add(new Student("bbb",25));
                Iterator<Student> it=s.iterator();//为什么写成Iterator it=s.iterator();下面的就编译不了啊   
                                                  //有点不明白请帮忙解释一下,谢谢
                while(it.hasNext())
                {
                        //System.out.println(it.next().getName());这一句编译的时候提示找不到getName方法?
                   //为什么写成System.out.println(it.next());编译就能通过呢?
                   System.out.println(it.next().getName());
                }
        }
}
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
                public String toString()
        {
                return name;
        }
}
class Student extends Person
{
        Student(String name,int age)
        {
                super(name,age);

        }
}
class Comp implements Comparator<Person>
{
        public int compare(Person p1,Person p2)
        {
                return p1.getName().compareTo(p2.getName());
        }
}

5 个回复

倒序浏览
我都通过了....也能打印出来...
回复 使用道具 举报
Iterator<Student> it=s.iterator();//为什么写成Iterator it=s.iterator();下面的就编译不了啊   
                                                  //有点不明白请帮忙解释一下,谢谢

写成Iterator it=s.iterator();这一句运行不了的原因是,包import java.util.Collection;中定义了一个如下的方法,
Iterator<E> iterator()返回在此 collection 的元素上进行迭代的迭代器。关于元素返回的顺序没有任何保证(除非此 collection 是某个能提供保证顺序的类实例)。
你代码里s.iterator();这个方法调用的就是这个类中的这个方法,因为这个方法的返回值是一个迭代器,类型就为<E>,一般赋值语句”=“前后的变量或对象的类型都必须相同才能赋值,否则,只能用强制类型转换,但你有没有强转,后面为<E>型,所以前面当然也要定义一个泛型类型与之对应啊,<Student>不可少。
至于 System.out.println(it.next().getName());这一句没有问题,编译能通过,结果打印出
aaa
bbb
ccc
回复 使用道具 举报
   查看jdk文档 public Iterator<E> iterator() 这个方法看到,如果你不定义泛型,就不能明确知道返回的迭代器里面装的是什么,
   这样一来当你对迭代器进行迭代时,调用.next()方法返回的对象无法被编译器识别为一个具体的对象,在这里它就不知道你是
   Student类对象,自然getName编译的时候就会提示找不到该方法,next()方法是迭代器中方法,而System.out方法在运行输
   出时调用具体类的toString方法,你看到的输出效果就和getName一样了,因为你的toString也是返回的name。
回复 使用道具 举报
本帖最后由 杨尧 于 2012-5-21 07:51 编辑
  1. class GenericDemo1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                
  6.                 TreeSet<Student> s=new TreeSet<Student>(new Comp());
  7.                 s.add(new Student("aaa",23));
  8.                 s.add(new Student("ccc",24));
  9.                 s.add(new Student("bbb",25));
  10.                 Iterator<Student> it=s.iterator();//为什么写成Iterator it=s.iterator();下面的就编译不了啊   

  11. //因为你这里如果不加泛型的话他默认的对象是object的,到下面如果用的话你得强转类型

  12.                                                   //有点不明白请帮忙解释一下,谢谢
  13.                 while(it.hasNext())
  14.                 {
  15.                         //System.out.println(it.next().getName());这一句编译的时候提示找不到getName方法?

  16. //上面iterator不加泛型的话it.next()获取的对象是Object的,他没有getName()方法
  17. //要想不加泛型也用getName()方法,可以在这里先强转类型 Object obj = it.next(); Student stu = (Student)obj;

  18.                    //为什么写成System.out.println(it.next());编译就能通过呢?
  19. //还是上面的原因,你直接打印object对象 他会自动调用object的toString()方法,所以没问题

  20.                    System.out.println(it.next().getName());
  21.                 }
  22.         }
  23. }
复制代码
回复 使用道具 举报
//为什么写成Iterator it=s.iterator();下面的就编译不了啊
//System.out.println(it.next().getName());这一句编译的时候提示找不到getName方法?

public Iterator<E> iterator()返回在此 set 中的元素上按升序进行迭代的迭代器。

因为迭代器如果不定义类型,那么返回的是Object,Object中并没有getName方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马