Java 如何将这两种方法转换为泛型方法?

Java 如何将这两种方法转换为泛型方法?,java,generics,Java,Generics,你好,我有以下两种方法 首先 public ObjectId getobjectdbyregionname(Region){ Query Query=datastore.createQuery(Region.class); query.field(“R_NAME”).equal(region.getName()); 返回query.get().getId(); } 第二 public ObjectId getObjectIdByNationName(Nation nation) {

你好,我有以下两种方法

首先

public ObjectId getobjectdbyregionname(Region){
Query Query=datastore.createQuery(Region.class);
query.field(“R_NAME”).equal(region.getName());
返回query.get().getId();
}
第二

public ObjectId getObjectIdByNationName(Nation nation) {
        Query<Nation> query = datastore.createQuery(Nation.class);
        query.field("N_NAME").equal(nation.getName());
        return query.get().getId();
    }
public ObjectId getObjectDBynationName(国家){
Query Query=datastore.createQuery(Nation.class);
query.field(“N_NAME”).equal(nation.getName());
返回query.get().getId();
}
如何将它们转换为通用方法?

尝试以下方法:

public <T> ObjectId getObjectByName(T name)
如注释中所述,您需要有一个具有
getName()
方法的参数。你需要一个限制来实现这一点。

试试这个:

public <T> ObjectId getObjectByName(T name)

如注释中所述,您需要有一个具有
getName()
方法的参数。要实现这一点,您需要一个限制。

尽管duffymo的方法更可取(cleaner等),但如果您无法控制参数类的源代码(或无法强制使用接口等),您可以这样做:

public <T> ObjectId getObjectIdByNationName(T param, String name, String fieldName) {
    Query<T> query = datastore.createQuery((Class<T>)param.getClass());
    query.field(fieldName).equal(name);
    return query.get().getId();
}
public ObjectId getObjectDBynationName(T参数、字符串名、字符串字段名){
Query Query=datastore.createQuery((Class)param.getClass());
query.field(fieldName).equal(name);
返回query.get().getId();
}
或者甚至是这个非泛型版本(因为您可以不使用类型范围):

public ObjectId getObjectDBynationName(对象参数、字符串名称、字符串字段名){
Query Query=datastore.createQuery(param.getClass());
query.field(fieldName).equal(name);
返回query.get().getId();
}

然而,这意味着调用方每次调用字段名和名称时都会出现一些重复。如果每个参数类型仅从一个位置调用,则不会有重复。

尽管duffymo的方法更可取(cleaner等),但如果您无法控制参数类的源(或无法强制使用接口等),您可以这样做:

public <T> ObjectId getObjectIdByNationName(T param, String name, String fieldName) {
    Query<T> query = datastore.createQuery((Class<T>)param.getClass());
    query.field(fieldName).equal(name);
    return query.get().getId();
}
public ObjectId getObjectDBynationName(T参数、字符串名、字符串字段名){
Query Query=datastore.createQuery((Class)param.getClass());
query.field(fieldName).equal(name);
返回query.get().getId();
}
或者甚至是这个非泛型版本(因为您可以不使用类型范围):

public ObjectId getObjectDBynationName(对象参数、字符串名称、字符串字段名){
Query Query=datastore.createQuery(param.getClass());
query.field(fieldName).equal(name);
返回query.get().getId();
}

然而,这意味着调用方每次调用字段名和名称时都会出现一些重复。如果每个参数类型仅从一个位置调用,则不会有重复。

同意-这是下一步。同意-这是下一步。+1-是的,如果不想创建单独的接口,这似乎也是一个很好的解决方案。+1-是的,如果不想创建单独的接口,这似乎也是一个很好的解决方案。
public <T> ObjectId getObjectIdByNationName(T param, String name, String fieldName) {
    Query<T> query = datastore.createQuery((Class<T>)param.getClass());
    query.field(fieldName).equal(name);
    return query.get().getId();
}
public ObjectId getObjectIdByNationName(Object param, String name, String fieldName) {
    Query<?> query = datastore.createQuery(param.getClass());
    query.field(fieldName).equal(name);
    return query.get().getId();
}