在学习泛型中遇到的多态的一个小问题
2017-12-22 00:49
363 查看
在学习泛型的过程中,我需要创建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;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public 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();
}
@Override
public int compareTo(PersonForGeneric o) {
// TODO Auto-generated method stub
if (this.getName().equals(o.getName()))
return this.getAge() - o.getAge();
else
return this.getName().compareTo(o.getName());
}
}
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 stub
if (this.name.equals(o.name))
return this.age - o.age;
else
return this.name.compareTo(o.name);
}
但是如果在treeset中传入子类,那么就会使得this.name等指向了父类的name,但是父类的name是没有被赋值的(成员变量没有多态)最后运行时会报空指针,如果一定要坚持的话,那么compareto方法要改成这样
public int compareTo(PersonForGeneric o) {
// TODO Auto-generated method stub
if (this.getName().equals(o.getName()))
return this.getAge() - o.getAge();
else
return this.getName().compareTo(o.getName());
}
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;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public 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();
}
@Override
public int compareTo(PersonForGeneric o) {
// TODO Auto-generated method stub
if (this.getName().equals(o.getName()))
return this.getAge() - o.getAge();
else
return 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; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public 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; } @Override public 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; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public 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; } @Override public 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 stub
if (this.name.equals(o.name))
return this.age - o.age;
else
return this.name.compareTo(o.name);
}
但是如果在treeset中传入子类,那么就会使得this.name等指向了父类的name,但是父类的name是没有被赋值的(成员变量没有多态)最后运行时会报空指针,如果一定要坚持的话,那么compareto方法要改成这样
public int compareTo(PersonForGeneric o) {
// TODO Auto-generated method stub
if (this.getName().equals(o.getName()))
return this.getAge() - o.getAge();
else
return this.getName().compareTo(o.getName());
}
相关文章推荐
- 学习K&R时初学者经常遇到的一个问题——EOF
- C语言学习中连用两个scanf遇到的一个问题
- 一个新手学习python的过程中遇到的一些问题及解决方法
- 这是我学习COM遇到的几个基本问题其解决 黄森堂(vcmfc)著 1.我用ATL生成一个组件对象,我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID? 答:IDD_IEncry
- Stream学习过程中遇到的一个问题记录
- 学习git 和遇到的一个git问题的解决方案 2017-02 学习
- 分享关于学习new BufferedWriter()方法时常遇到的一个无厘头的问题
- MySQL遇到的一个卡库问题及对update的学习
- 解决学习tensorflow的LSTM模型中遇到一个版本不兼容问题
- 记录今天学习SQL遇到的一个小问题
- spring实战第四版-第五章学习遇到的一个小问题
- Spark刚学习时遇到的一个小问题
- 本人小白一枚,刚学习SpringMVC+MyBatis,遇到了一个问题一直报错 **No mapping found for HTTP request with URI**
- C#中ArrayList 与 string、string[]数组 的转换 (转学习:今天做项目时遇到一个arrylist转换问题,做记录)
- spring Boot项目遇到的一个小问题学习到repeatable annotations
- java 学习泛型遇到的问题
- 学习Scala override时遇到的一个小问题
- 在学习autotools遇到一个问题:make没有按照VPATH给的目录进行搜索,请大家指导一下。
- 学习object-c时遇到的一个问题,报了一大堆的错,半天没头绪.原来是小问题,记载一下
- 遇到问题应该多思考一下——由一个泛型方法想到的