黑马程序员技术交流社区
标题:
关于毕老师视频中的一个instanceof问题,程序的健壮性改进
[打印本页]
作者:
王溢君
时间:
2013-1-16 22:57
标题:
关于毕老师视频中的一个instanceof问题,程序的健壮性改进
import java.util.*;
/*
往hashSet集合中存入自定义对象
姓名和年龄相同为同一个人,重复元素。
*/
class HashSetTest
{
public static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add(new Person("a1",11));
hs.add(new Person("a2",12));
hs.add(new Person("a3",13));
hs.add(new Person("a3",13));
hs.add(new Demo());
//hs.add(new Person("a2",12));
//hs.add(new Person("a2",12));
//hs.add(new Person("a2",12));
Iterator it = hs.iterator();
while(it.hasNext())
{
Person p = (Person)it.next();
sop(p.getName()+"..."+p.getAge());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class Demo
{
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public int hashCode()
{
System.out.println(this.name+"...hash");
//return 60;//哈希地址一样,再调用equals
return name.hashCode()+age*39;//有的要*39,尽量保证唯一。
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
//先判断是否包含,更严谨的话,这里直接抛异常。我不传person,传DEMO,没意义
Person p = (Person)(obj);
System.out.println(this.name+"..."+p.name);//如果此处没有打印,没有调用,
//因为地址不同,不再比较equals
return this.name.equals(p.name) && this.age==p.age;
}
}
复制代码
//先判断是否包含,更严谨的话,这里直接抛异常。我不传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