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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wyy666 中级黑马   /  2014-5-31 23:58  /  1943 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class  HashSetDemo
{
         public static void main(String[] args)
         {
                 HashSet ht = new HashSet();
                 ht.add(new Student("小五",19));
                 ht.add(new Student("地方",139));
                 ht.add(new Student("小df",129));
                 ht.add(new Student("小dfaaadf",197));
                 Iterator it = ht.iterator();
                 while(it.hasNext())
                 {
                         System.out.println(it.next().name);
                         /*提示找不到符号,为什么it.next().getClass()方法返回的是Student对象,为什么it.next().name这条语句会出现错误*/
                 }
         }
}
class Student
{
         public String name;
         public int num;
         public Student(String name,int num)
         {
                 this.name = name;
                 this.num = num;
         }
}

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

6 个回复

倒序浏览
因为没有加泛型,HashSet集合是不知道开发这往里面加什么数据的,所以提示找不到Student。把代码改成以下代码就可以了。
  1. package test1;
  2. import java.util.*;
  3. public class HashSetDemo {

  4.         public static void main(String[] args) {
  5.                
  6.                
  7.                         
  8.                                  HashSet<Student> ht = new HashSet();
  9.                                  
  10.                                  ht.add(new Student("小五",19));
  11.                                  ht.add(new Student("地方",139));
  12.                                 ht.add(new Student("小df",129));
  13.                                 ht.add(new Student("小dfaaadf",197));
  14.                                  Iterator<Student> it = ht.iterator();
  15.                                  
  16.                                 
  17.                                  while(it.hasNext())
  18.                                  {
  19.                                           
  20.                                  
  21.                                          System.out.println(it.next().name);
  22.                                        
  23.                                  }
  24.                         
  25.                
  26.         }
  27.        

  28. }

  29. class Student
  30. {
  31.          public String name;
  32.          public int num;
  33.          public Student(String name,int num)
  34.          {
  35.                  this.name = name;
  36.                  this.num = num;
  37.          }
  38. }
复制代码

望采纳,另外求吧主给点技术分吧,新人不容易啊

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 李小然 于 2014-6-1 02:53 编辑

HashSet中的boolean add()方法中的参数可以理解为Object
即声明为:boolean add(Object obj)
在这样的情况下,
你用ht.add(new Student("小五",19));向HashSet中添加元素,
相当于中间有一句
Object obj = new Student("小五",19));


父类引用指向子类对象,这是典型的多态问题。

而Iterator it = ht.iterator();
it.next()相当于拿到的是每个obj的引用。

这就解释了为什么你用it.next().getClass()得到的是Student类(因为是new的Student),
但是却调用不了getName()方法(父类引用无法调用子类特有方法)。

:dizzy:不知道代码为什么总是抽,放在下面的楼中..

回复 使用道具 举报
本帖最后由 李小然 于 2014-6-1 02:56 编辑

以下是解决办法:
import java.util.*;
class  HashSetDemo
{
         public static void main(String[] args)
         {
                 HashSet ht = new HashSet();
                 ht.add(new Student("小五",19));
                 ht.add(new Student("地方",139));
                 ht.add(new Student("小df",129));
                 ht.add(new Student("小dfaaadf",197));
                 Iterator it = ht.iterator();
                                 
                 while(it.hasNext())
                 {
                       //将obj类型强转为Student类型
                      Student st = (Student)it.next();
                                                
                       System.out.println("Name: " + st.name +" Num: " + st.num);
                 }
         }
}
class Student
{
         public String name;
         public int num;
         public Student(String name,int num)
         {
                 this.name = name;
                 this.num = num;
         }
}




评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 赞一个!

查看全部评分

回复 使用道具 举报
/*提示找不到符号,为什么it.next().getClass()方法返回的是Student对象,为什么it.next().name这条语句会出现错误*/之所以会这样是因为,迭代器在返回元素的时候对类类型进行了默认的类型提升,也就是Student类被提升了为了Object类,所以Student类中的name属性就不能调用了,getClass()方法返回Student-body这也是多态的一种体现。想得到Student中的那么属性,只要做一下强转动作就行,把返回的Object类在给强转回Student类即可,楼主可以这样改:
  1. import java.util.*;
  2. class  HashSetDemo
  3. {
  4.          public static void main(String[] args)
  5.          {
  6.                  HashSet ht = new HashSet();
  7.                  ht.add(new Student("小五",19));
  8.                  ht.add(new Student("地方",139));
  9.                  ht.add(new Student("小df",129));
  10.                  ht.add(new Student("小dfaaadf",197));
  11.                  Iterator it = ht.iterator();
  12.                  while(it.hasNext())
  13.                  {
  14. //<font color="Red">在调用Student的属性之前,我们先把它强转为Student类就可以了  Object类中没有name属性才会报错 找不到符号!!!</font>
  15.                          System.out.println(((Student)it.next()).name);
  16.                  }
  17.          }
  18. }
  19. class Student
  20. {
  21.          public String name;
  22.          public int num;
  23.          public Student(String name,int num)
  24.          {
  25.                  this.name = name;
  26.                  this.num = num;
  27.          }
  28. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 赞一个!

查看全部评分

回复 使用道具 举报
为什么我看代码时没有反应过来是缺泛型呢……继续努力
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马