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
子类。

如果不能更改类,可以对其进行扩展。然后使扩展实现一个接口。