Java 从不同类调用相同名称的方法
我有一些类具有相同名称的方法。比如说Java 从不同类调用相同名称的方法,java,generic-programming,Java,Generic Programming,我有一些类具有相同名称的方法。比如说 public class People { private Long id; private String nm; private String nmBn; ............. public Long getId() { return id; } public String getNm() { return nm; } public Strin
public class People {
private Long id;
private String nm;
private String nmBn;
.............
public Long getId() {
return id;
}
public String getNm() {
return nm;
}
public String getNmBn() {
return nmBn;
}
}
public class Company {
private Long id;
private String nm;
private String nmBn;
.............
public Long getId() {
return id;
}
public String getNm() {
return nm;
}
public String getNmBn() {
return nmBn;
}
}
然后我需要一种工作原理如下的方法:
public String getPeopleString(People people) {
if (people == null) {
return "";
}
return people.getNmBn() + "|" + people.getNm() + "#" + people.getId();
}
public String getCompanyString(Company company) {
if (company == null) {
return "";
}
return company.getNmBn() + "|" + company.getNm() + "#" + company.getId();
}
所以这些方法做的事情是一样的,但对象类型不同
有没有一种方法可以做到这一点
请注意,我不能对
人员
类或公司
类进行任何更改。如果这些类没有实现公共接口或扩展公共基类,即除了名称和签名之外,这两组方法之间没有任何关系,那么实现这一点的唯一方法是通过反思
String getString(Object companyOrPeople) throws InvocationTargetException, IllegalAccessException
{
if (companyOrPeople == null) {
return "";
}
final Method getNmBn = companyOrPeople.getClass().getDeclaredMethod("getNmBn");
final String nmBm = getNmBn.invoke(companyOrPeople).toString();
// same with the other two methods
return nmBm + "|" + nm + "#" + id;
}
但是,不建议这样做。您将失去这些方法实际存在的所有编译时保证。没有什么可以阻止某人传递整数、字符串或任何其他没有这些getter的类型
最好的做法是更改现有类型,但如果不能,则不能
如果您确实决定更改现有类型,那么在您进行更改时,请帮自己一个忙,并更改属性的名称。因为nmBn到底是什么?哦,当然,每个公司都有一个麻木的。我真傻。首先,你应该用常用方法创建一个接口,我们称之为
可识别的:
public interface Identifiable {
Long getId();
String getNm();
String getNmBn();
}
理想情况下,您可以让People
和Company
实现此接口,但正如您所说,您不能修改现有的Company
和People
类,然后需要扩展它们,并让子类实现可识别的接口:
public PeopleExtended extends People implements Identifiable { }
public CompanyExtended extends Company implements Identifiable { }
现在,只需将getCompanyString
和getPeopleString
方法更改为:
public String getIdString(Identifiable id) {
return id == null ?
"" :
id.getNmBn() + "|" + id.getNm() + "#" + id.getId();
}
显然,使用PeopleExtended
和CompanyExtended
子类。如果不能更改类,可以对其进行扩展。然后使扩展实现一个接口。