黑马程序员技术交流社区

标题: 关于毕老师视频中的一个instanceof问题,程序的健壮性改进 [打印本页]

作者: 王溢君    时间: 2013-1-16 22:57
标题: 关于毕老师视频中的一个instanceof问题,程序的健壮性改进
  1. import java.util.*;
  2. /*
  3. 往hashSet集合中存入自定义对象

  4. 姓名和年龄相同为同一个人,重复元素。


  5. */
  6. class  HashSetTest
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 HashSet hs = new HashSet();

  11.                 hs.add(new Person("a1",11));
  12.                 hs.add(new Person("a2",12));
  13.                 hs.add(new Person("a3",13));
  14.                 hs.add(new Person("a3",13));
  15.                 hs.add(new Demo());
  16.                 //hs.add(new Person("a2",12));
  17.                 //hs.add(new Person("a2",12));
  18.                 //hs.add(new Person("a2",12));

  19.                 Iterator it = hs.iterator();
  20.                
  21.                 while(it.hasNext())
  22.                 {
  23.                         Person p = (Person)it.next();
  24.                        
  25.                         sop(p.getName()+"..."+p.getAge());
  26.                 }
  27.         }

  28.         public static void sop(Object obj)
  29.         {
  30.                 System.out.println(obj);
  31.         }
  32. }

  33. class Demo
  34. {

  35. }

  36. class Person
  37. {
  38.         private String name;
  39.         private int age;
  40.         Person(String name,int age)
  41.         {
  42.                 this.name = name;
  43.                 this.age = age;
  44.         }

  45.         public int hashCode()
  46.         {
  47.                 System.out.println(this.name+"...hash");
  48.                 //return 60;//哈希地址一样,再调用equals
  49.                 return name.hashCode()+age*39;//有的要*39,尽量保证唯一。
  50.                
  51.         }
  52.         public  String getName()
  53.         {
  54.                 return name;
  55.         }
  56.         public  int getAge()
  57.         {
  58.                 return age;
  59.         }

  60.         public boolean equals(Object obj)
  61.         {
  62.                 if(!(obj instanceof Person))
  63.                         return false;
  64.                 //先判断是否包含,更严谨的话,这里直接抛异常。我不传person,传DEMO,没意义
  65.                 Person p = (Person)(obj);
  66.                 System.out.println(this.name+"..."+p.name);//如果此处没有打印,没有调用,
  67.                 //因为地址不同,不再比较equals
  68.                 return this.name.equals(p.name) && this.age==p.age;
  69.         }
  70.        
  71. }
复制代码
//先判断是否包含,更严谨的话,这里直接抛异常。我不传person,传DEMO,没意义

程序会报ClassCastException错误,这是因为Demo不属于Person,强转不成功,代码为毕老师视频中的演示例子,毕老师也有提到这个错误,为了这个程序的健壮,我们应该怎么改进?就是不管添加哪种对象,程序都行运行。
是改写instanceof这段吗?
帮帮忙,各位。
作者: jonn    时间: 2013-1-16 23:29
用泛型就可以解决LZ的疑问了
作者: 王溢君    时间: 2013-1-16 23:41
帮忙修改一下啊,我还没学到。。。。。
作者: 梁俊    时间: 2013-1-18 22:25
HashSet hs = new HashSet();改成HashSet<Person> hs = new HashSet<Person>();就可以了,这样HashSet集合里面只能存放Person类型的对象了,如果放其他类型对象会编译出错
作者: ζ丶凡σ    时间: 2013-11-6 13:15
{:soso_e100:}




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