在学习泛型中遇到的多态的一个小问题

来源:互联网 发布:英国 实力 知乎 编辑:程序博客网 时间:2024/06/05 20:18

在学习泛型的过程中,我需要创建person、worker、student 一个父类两个子类,但是在创建过程遇到一些问题,先上代码


package cn.haiyisoft.domain;public class PersonForGeneric implements Comparable<PersonForGeneric> {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;PersonForGeneric other = (PersonForGeneric) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}public PersonForGeneric(String name, int age) {super();this.name = name;this.age = age;}public PersonForGeneric() {super();}@Overridepublic int compareTo(PersonForGeneric o) {// TODO Auto-generated method stubif (this.getName().equals(o.getName()))return this.getAge() - o.getAge();elsereturn this.getName().compareTo(o.getName());}}

package cn.haiyisoft.domain;public class WorkerForGeneric extends PersonForGeneric {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public WorkerForGeneric(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = super.hashCode();result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (!super.equals(obj))return false;if (getClass() != obj.getClass())return false;WorkerForGeneric other = (WorkerForGeneric) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}@Overridepublic String toString() {return "WorkerForGeneric [name=" + name + ", age=" + age + "]";}}

package cn.haiyisoft.domain;public class StudentForGeneric extends PersonForGeneric {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;StudentForGeneric other = (StudentForGeneric) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}public StudentForGeneric(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "StudentForGeneric [name=" + name + ", age=" + age + "]";}}


person类实现了comparable接口,worker和student类继承了person类,按照正常的设计来讲,worker和student类不需要再定义name。age以及相应的set和get方法,但是我在两个类里又重新定义了name和age 这就导致了person类中的compareto方法有了些问题

正常来讲compareto方法里面应该是这样的

public int compareTo(PersonForGeneric o) {// TODO Auto-generated method stubif (this.name.equals(o.name))return this.age - o.age;elsereturn this.name.compareTo(o.name);}


但是如果在treeset中传入子类,那么就会使得this.name等指向了父类的name,但是父类的name是没有被赋值的(成员变量没有多态)最后运行时会报空指针,如果一定要坚持的话,那么compareto方法要改成这样

public int compareTo(PersonForGeneric o) {// TODO Auto-generated method stubif (this.getName().equals(o.getName()))return this.getAge() - o.getAge();elsereturn this.getName().compareTo(o.getName());}